]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '1.0.x' into people_tags_rebase
authorShashi Gowda <connect2shashi@gmail.com>
Tue, 22 Mar 2011 02:26:25 +0000 (07:56 +0530)
committerShashi Gowda <connect2shashi@gmail.com>
Tue, 22 Mar 2011 02:26:25 +0000 (07:56 +0530)
Conflicts:
EVENTS.txt
actions/peopletag.php
actions/tagother.php
classes/Notice.php
js/util.js
js/util.min.js
lib/accountprofileblock.php
lib/action.php
lib/activityobject.php
lib/command.php
lib/personalgroupnav.php
plugins/OStatus/OStatusPlugin.php

23 files changed:
1  2 
EVENTS.txt
actions/public.php
actions/selftag.php
classes/Notice.php
classes/statusnet.ini
db/core.php
js/util.js
js/util.min.js
lib/accountprofileblock.php
lib/action.php
lib/activityobject.php
lib/command.php
lib/commandinterpreter.php
lib/default.php
lib/framework.php
lib/personalgroupnav.php
lib/publicgroupnav.php
lib/router.php
lib/subgroupnav.php
lib/util.php
plugins/OStatus/OStatusPlugin.php
theme/base/css/display.css
theme/default/css/display.css

diff --cc EVENTS.txt
index 7b154ec3530b34a5d7eb66583d82b1f38fb57e92,54d06655eecdcbb592ac307579bcd25e547e6e34..5fdf7b8b9d2e715d876176e6288f842d1dc3ec5a
@@@ -1116,152 -1116,26 +1116,176 @@@ EndGroupProfileElements: Start showing 
  - $action: action being executed (for output and params)
  - $group: group for the page
  
 +StartShowProfileTagContent: When showing a people tag page
 +- $action: action being executed (for output and params)
 +
 +EndShowProfileTagContent: After showing the contents of a people tag page
 +- $action: action being executed (for output and params)
 +
 +StartShowTaggedProfilesMiniList: at the start of mini list of tagged profiles
 +- $action: action being executed (for output and params)
 +
 +EndShowTaggedProfilesMiniList: at the end of mini list of tagged profiles
 +- $action: action being executed (for output and params)
 +
 +StartShowProfileTagSubscribersMiniList: at the start of mini list of people tag subscribers
 +- $action: action being executed (for output and params)
 +
 +EndShowProfileTagSubscribersMiniList: at the end of mini list of people tag subscribers
 +- $action: action being executed (for output and params)
 +
 +StartTagProfileAction: When starting to show profile tagging page
 +- $action: action being executed (for output and params)
 +- $profile: profile being tagged
 +
 +EndTagProfileAction: After showing profile tagging page
 +- $action: action being executed (for output and params)
 +- $profile: profile being tagged
 +
 +StartProfileCompletionSearch: When starting a profile search for autocompletion
 +- $action: action being executed (for output and params)
 +- &$profile: result Profile objects
 +- $search_engine: the search engine
 +
 +EndProfileCompletionSearch: After search results for profile autocompletion have been found
 +- $action: profilec completion action
 +- &$profile: current result Profile objects
 +- $search_engine: The search engine object
 +
 +StartShowTagProfileForm: When showing people tagging form
 +- $action: action being executed (for output and params)
 +- $profile: profile being tagged
 +
 +EndShowTagProfileForm: After showing people tagging form
 +- $action: action being executed (for output and params)
 +- $profile: profile being tagged
 +
 +StartSavePeopletags: When starting to save people tags
 +- $action: action being executed (for output and params)
 +- $tagstring: string input, a list of tags
 +
 +EndSavePeopletags: After saving people tags
 +- $action: action being executed (for output and params)
 +- $tagstring: string input, a list of tags
 +
 +StartProfiletagGetUri: when generating the Uri for a people tag
 +- $profile_list: the people tag, a Profile_list object
 +- &$uri: the URI
 +
 +EndProfiletagGetUri: after generating the uri for a people tag
 +- $profile_list: the people tag, a Profile_list object
 +- &$uri: the URI
 +
 +StartUserPeopletagHomeUrl: when generating the homepage url for a people tag
 +- $profile_list: the people tag, a Profile_list object
 +- &$url: the URL
 +
 +EndUserPeopletagHomeUrl: after generating the homepage url for a people tag
 +- $profile_list: the people tag, a Profile_list object
 +- &$url: the URL
 +
 +StartProfiletagPermalink: when generating the permalink url for a people tag
 +- $profile_list: the people tag, a Profile_list object
 +- &$url: the URL
 +
 +EndProfiletagPermalink: after generating the permalink url for a people tag
 +- $profile_list: the people tag, a Profile_list object
 +- &$url: the URL
 +
 +StartTagProfile: when tagging a profile
 +- $tagger: profile tagging
 +- $tagged: profile being tagged
 +- $tag: the tag
 +
 +EndTagProfile: after tagging a profile
 +- $newtag: the newly created Profile_tag object
 +
 +StartUntagProfile: when deleting a people tag
 +- $ptag: the Profile_tag object being deleted
 +
 +EndUntagProfile: after deleting a people tag
 +- $orig: a copy of the deleted Profile_tag object
 +
 +StartSubscribePeopletag: when subscribing to a people tag
 +- $peopletag: Profile_list object being subscribed to
 +- $profile: subscriber's profile
 +
 +EndSubscribePeopletag: after subscribing to a people tag
 +- $profile_list: the people tag, a Profile_list object: Profile_list object being subscribed to
 +- $profile: subscriber's profile
 +
 +StartUnsubscribePeopletag: when unsubscribing to a people tag
 +- $profile_list: the people tag, a Profile_list object: Profile_list object being subscribed to
 +- $profile: subscriber's profile
 +
 +EndUnsubscribePeopletag: after unsubscribing to a people tag
 +- $peopletag: Profile_list object being subscribed to
 +- $profile: subscriber's profile
 +
 +StartActivityObjectFromPeopletag: while starting to create an ActivityObject from a people tag
 +- $profile_list: the people tag, a Profile_list object
 +- &$object: activity object
 +
 +EndActivityObjectFromPeopletag: after making an ActivityObject from a people tag
 +- $profile_list: the people tag, a Profile_list object
 +- &$object: activity object
 +
 +StartPeopletagGroupNav: Showing the people tag nav menu
 +- $menu: the menu widget; use $menu->action for output
 +
 +EndPeopletagGroupNav: after showing the people tag nav menu
 +- $menu: the menu widget; use $menu->action for output
 +
 +StartShowPeopletagItem: when showing a people tag
 +- $widget: PeopletagListItem widget
 +
 +EndShowPeopletagItem: after showing a people tag
 +- $widget: PeopletagListItem widget
 +
 +StartSubscribePeopletagForm: when showing people tag subscription form
 +- $action: action being executed (for output and params)
 +- $peopletag: people tag being subscribed to
 +
 +EndSubscribePeopletagForm: after showing the people tag subscription form
 +- $action: action being executed (for output and params)
 +- $peopletag: people tag being subscribed to
 +
 +StartShowPeopletags: when showing a textual list of people tags
 +- $widget: PeopletagsWidget; use $widget->out for output
 +- $tagger: profile of the tagger
 +- $tagged: profile tagged
 +
 +EndShowPeopletags: after showing a textual list of people tags
 +- $widget: PeopletagsWidget; use $widget->out for output
 +- $tagger: profile of the tagger
 +- $tagged: profile tagged
 +
 +StartProfileListItemTags: when showing people tags in a profile list item widget
 +- $widget: ProfileListItem widget
 +
 +EndProfileListItemTags: after showing people tags in a profile list item widget
 +- $widget: ProfileListItem widget
++
+ StartActivityObjectOutputAtom: Called at start of Atom XML output generation for ActivityObject chunks, just inside the <activity:object>. Cancel the event to take over its output completely (you're responsible for calling the matching End event if so)
+ - $obj: ActivityObject
+ - $out: XMLOutputter to append custom output
+ EndActivityObjectOutputAtom: Called at end of Atom XML output generation for ActivityObject chunks, just inside the </activity:object>
+ - $obj: ActivityObject
+ - $out: XMLOutputter to append custom output
+ StartActivityObjectOutputJson: Called at start of JSON output generation for ActivityObject chunks: the array has not yet been filled out. Cancel the event to take over its output completely (you're responsible for calling the matching End event if so)
+ - $obj ActivityObject
+ - &$out: array to be serialized; you're free to modify it
+ EndActivityObjectOutputJson: Called at end of JSON output generation for ActivityObject chunks: the array has not yet been filled out.
+ - $obj ActivityObject
+ - &$out: array to be serialized; you're free to modify it
+ StartNoticeWhoGets: Called at start of inbox delivery prep; plugins can schedule notices to go to particular profiles that would otherwise not have reached them. Canceling will take over the entire addressing operation. Be aware that output can be cached or used several times, so should remain idempotent.
+ - $notice Notice
+ - &$ni: in/out array mapping profile IDs to constants: NOTICE_INBOX_SOURCE_SUB etc
+ EndNoticeWhoGets: Called at end of inbox delivery prep; plugins can filter out profiles from receiving inbox delivery here.  Be aware that output can be cached or used several times, so should remain idempotent.
+ - $notice Notice
+ - &$ni: in/out array mapping profile IDs to constants: NOTICE_INBOX_SOURCE_SUB etc
Simple merge
index 0efb896f6b5675db24fb0a9cf1c99f4f63680c45,0000000000000000000000000000000000000000..b0b4981f10c237887127f16d63e1c8b813ebb041
mode 100644,000000..100644
--- /dev/null
@@@ -1,204 -1,0 +1,205 @@@
 +<?php
 +/**
 + * StatusNet, the distributed open-source microblogging tool
 + *
 + * Action for showing profiles self-tagged with a given tag
 + *
 + * PHP version 5
 + *
 + * LICENCE: This program is free software: you can redistribute it and/or modify
 + * it under the terms of the GNU Affero General Public License as published by
 + * the Free Software Foundation, either version 3 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU Affero General Public License for more details.
 + *
 + * You should have received a copy of the GNU Affero General Public License
 + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 + *
 + * @category  Action
 + * @package   StatusNet
 + * @author    Evan Prodromou <evan@status.net>
 + * @author    Zach Copley <zach@status.net>
 + * @copyright 2009 StatusNet, Inc.
 + * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 + * @link      http://status.net/
 + */
 +
 +if (!defined('STATUSNET') && !defined('LACONICA')) {
 +    exit(1);
 +}
 +
 +/**
 + * This class outputs a paginated list of profiles self-tagged with a given tag
 + *
 + * @category Output
 + * @package  StatusNet
 + * @author   Evan Prodromou <evan@status.net>
 + * @author   Zach Copley <zach@status.net>
 + * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 + * @link     http://status.net/
 + *
 + * @see      Action
 + */
 +class SelftagAction extends Action
 +{
 +
 +    var $tag  = null;
 +    var $page = null;
 +
 +    /**
 +     * For initializing members of the class.
 +     *
 +     * @param array $argarray misc. arguments
 +     *
 +     * @return boolean true
 +     */
 +    function prepare($argarray)
 +    {
 +        parent::prepare($argarray);
 +
 +        $this->tag = $this->trimmed('tag');
 +
 +        if (!common_valid_profile_tag($this->tag)) {
++            // TRANS: Client error displayed when trying to tag a profile with an invalid tag.
++            // TRANS: %s is the invalid tag.
 +            $this->clientError(sprintf(_('Not a valid people tag: %s.'),
 +                $this->tag));
 +            return;
 +        }
 +
 +        $this->page = ($this->arg('page')) ? $this->arg('page') : 1;
 +
 +        common_set_returnto($this->selfUrl());
 +
 +        return true;
 +    }
 +
 +    /**
 +     * Handler method
 +     *
 +     * @param array $argarray is ignored since it's now passed in in prepare()
 +     *
 +     * @return boolean is read only action?
 +     */
 +    function handle($argarray)
 +    {
 +        parent::handle($argarray);
 +        $this->showPage();
 +    }
 +
 +    /**
 +     * Whips up a query to get a list of profiles based on the provided
 +     * people tag and page, initalizes a ProfileList widget, and displays
 +     * it to the user.
 +     *
 +     * @return nothing
 +     */
 +    function showContent()
 +    {
 +
 +        $profile = new Profile();
 +
 +        $offset = ($this->page - 1) * PROFILES_PER_PAGE;
 +        $limit  = PROFILES_PER_PAGE + 1;
 +
 +        if (common_config('db', 'type') == 'pgsql') {
 +            $lim = ' LIMIT ' . $limit . ' OFFSET ' . $offset;
 +        } else {
 +            $lim = ' LIMIT ' . $offset . ', ' . $limit;
 +        }
 +
 +        // XXX: memcached this
 +
 +        $qry =  'SELECT profile.* ' .
 +                'FROM profile JOIN ( profile_tag, profile_list ) ' .
 +                'ON profile.id = profile_tag.tagger ' .
 +                'AND profile_tag.tagger = profile_list.tagger ' .
 +                'AND profile_list.tag = profile_tag.tag ' .
 +                'WHERE profile_tag.tagger = profile_tag.tagged ' .
 +                "AND profile_tag.tag = '%s' ";
 +
 +        $user = common_current_user();
 +        if (empty($user)) {
 +            $qry .= 'AND profile_list.private = false ';
 +        } else {
 +            $qry .= 'AND (profile_list.tagger = ' . $user->id .
 +                    ' OR profile_list.private = false) ';
 +        }
 +
 +        $qry .= 'ORDER BY profile_tag.modified DESC%s';
 +
 +        $profile->query(sprintf($qry, $this->tag, $lim));
 +
 +        $ptl = new SelfTagProfileList($profile, $this); // pass the ammunition
 +        $cnt = $ptl->show();
 +
 +        $this->pagination($this->page > 1,
 +                          $cnt > PROFILES_PER_PAGE,
 +                          $this->page,
 +                          'selftag',
 +                          array('tag' => $this->tag));
 +    }
 +
 +    /**
 +     * Returns the page title
 +     *
 +     * @return string page title
 +     */
 +    function title()
 +    {
 +        return sprintf(_('Users self-tagged with %1$s - page %2$d'),
 +            $this->tag, $this->page);
 +    }
 +
 +}
 +
 +class SelfTagProfileList extends ProfileList
 +{
 +    function newListItem($profile)
 +    {
 +        return new SelfTagProfileListItem($profile, $this->action);
 +    }
 +}
 +
 +class SelfTagProfileListItem extends ProfileListItem
 +{
 +    function linkAttributes()
 +    {
 +        $aAttrs = parent::linkAttributes();
 +
 +        if (common_config('nofollow', 'selftag')) {
 +            $aAttrs['rel'] .= ' nofollow';
 +        }
 +
 +        return $aAttrs;
 +    }
 +
 +    function homepageAttributes()
 +    {
 +        $aAttrs = parent::linkAttributes();
 +
 +        if (common_config('nofollow', 'selftag')) {
 +            $aAttrs['rel'] = 'nofollow';
 +        }
 +
 +        return $aAttrs;
 +    }
 +
 +    function showTags()
 +    {
 +        $selftags = new SelfTagsWidget($this->out, $this->profile, $this->profile);
 +        $selftags->show();
 +
 +        $user = common_current_user();
 +
 +        if (!empty($user) && $user->id != $this->profile->id &&
 +                $user->getProfile()->canTag($this->profile)) {
 +            $yourtags = new PeopleTagsWidget($this->out, $user, $this->profile);
 +            $yourtags->show();
 +        }
 +    }
 +}
index 21795ae21b5e27fe261711d91f7e34fde6e7c82f,a158a4930df6f4eb4aa3c1d1401f3933f1845d3b..79b034e76f9bb9055b5365f630b241c29758d03d
@@@ -811,53 -848,48 +855,59 @@@ class Notice extends Memcached_DataObje
  
          $ni = array();
  
-         foreach ($users as $id) {
-             $ni[$id] = NOTICE_INBOX_SOURCE_SUB;
-         }
+         // Give plugins a chance to add folks in at start...
+         if (Event::handle('StartNoticeWhoGets', array($this, &$ni))) {
  
-         foreach ($groups as $group) {
-             $users = $group->getUserMembers();
              foreach ($users as $id) {
-                 if (!array_key_exists($id, $ni)) {
-                     $ni[$id] = NOTICE_INBOX_SOURCE_GROUP;
+                 $ni[$id] = NOTICE_INBOX_SOURCE_SUB;
+             }
+             foreach ($groups as $group) {
+                 $users = $group->getUserMembers();
+                 foreach ($users as $id) {
+                     if (!array_key_exists($id, $ni)) {
+                         $ni[$id] = NOTICE_INBOX_SOURCE_GROUP;
+                     }
                  }
              }
-         }
  
 -            foreach ($recipients as $recipient) {
 -                if (!array_key_exists($recipient, $ni)) {
 -                    $ni[$recipient] = NOTICE_INBOX_SOURCE_REPLY;
 +        foreach ($ptags as $ptag) {
 +            $users = $ptag->getUserSubscribers();
 +            foreach ($users as $id) {
 +                if (!array_key_exists($id, $ni)) {
 +                    $user = User::staticGet('id', $id);
 +                    if (!$user->hasBlocked($profile)) {
 +                        $ni[$id] = NOTICE_INBOX_SOURCE_PROFILE_TAG;
 +                    }
                  }
              }
-         }
 +        }
 +
 +        foreach ($recipients as $recipient) {
 +            if (!array_key_exists($recipient, $ni)) {
 +                $ni[$recipient] = NOTICE_INBOX_SOURCE_REPLY;
 +            }
  
-         // Exclude any deleted, non-local, or blocking recipients.
-         $profile = $this->getProfile();
-         $originalProfile = null;
-         if ($this->repeat_of) {
-             // Check blocks against the original notice's poster as well.
-             $original = Notice::staticGet('id', $this->repeat_of);
-             if ($original) {
-                 $originalProfile = $original->getProfile();
+             // Exclude any deleted, non-local, or blocking recipients.
+             $profile = $this->getProfile();
+             $originalProfile = null;
+             if ($this->repeat_of) {
+                 // Check blocks against the original notice's poster as well.
+                 $original = Notice::staticGet('id', $this->repeat_of);
+                 if ($original) {
+                     $originalProfile = $original->getProfile();
+                 }
              }
-         }
-         foreach ($ni as $id => $source) {
-             $user = User::staticGet('id', $id);
-             if (empty($user) || $user->hasBlocked($profile) ||
-                 ($originalProfile && $user->hasBlocked($originalProfile))) {
-                 unset($ni[$id]);
+             foreach ($ni as $id => $source) {
+                 $user = User::staticGet('id', $id);
+                 if (empty($user) || $user->hasBlocked($profile) ||
+                     ($originalProfile && $user->hasBlocked($originalProfile))) {
+                     unset($ni[$id]);
+                 }
              }
+             // Give plugins a chance to filter out...
+             Event::handle('EndNoticeWhoGets', array($this, &$ni));
          }
  
          if (!empty($c)) {
Simple merge
diff --cc db/core.php
Simple merge
diff --cc js/util.js
index 84943e8b2416947c39c0eabf22423b993a75f3df,61e6719dcc9955bc00457d6bb786f1a94ada12f3..98fb6c985026114808d615d5f244be2ed14fdbee
@@@ -1434,45 -1456,16 +1543,55 @@@ var SN = { // StatusNe
              });
          },
  
 +        PeopletagAutocomplete: function() {
 +            $('.form_tag_user #tags').tagInput({
 +                tags: SN.C.PtagACData,
 +                tagSeparator: " ",
 +                animate: false,
 +                formatLine: function (i, e, search, matches) {
 +                  var tag = "<b>" + e.tag.substring(0, search.length) + "</b>" + e.tag.substring(search.length);
 +
 +                  var line = $("<div/>").addClass('mode-' + e.mode);
 +                    line.append($("<div class='tagInputLineTag'>" + tag
 +                        + " <em class='privacy_mode'>" + e.mode + "</em></div>"));
 +                  if (e.freq)
 +                    line.append("<div class='tagInputLineFreq'>" + e.freq + "</div>");
 +                  return line;
 +                }
 +            });
 +        },
 +
 +        PeopleTags: function() {
 +            $('.user_profile_tags .editable').append($('<button class="peopletags_edit_button"/>'));
 +
 +            $('.peopletags_edit_button').live('click', function() {
 +                var form = $(this).parents('dd').eq(0).find('form');
 +                // We can buy time from the above animation
 +                if (typeof SN.C.PtagACData === 'undefined') {
 +                    $.getJSON(_peopletagAC + '?token=' + $('#token').val(), function(data) {
 +                        SN.C.PtagACData = data;
 +                        _loadTagInput(SN.Init.PeopletagAutocomplete);
 +                    });
 +                } else { _loadTagInput(SN.Init.PeopletagAutocomplete); }
 +
 +                $(this).parents('ul').eq(0).fadeOut(200, function() {form.fadeIn(200).find('input#tags')});
 +            })
 +
 +            $('.user_profile_tags form .submit').live('click', function() {
 +                SN.U.FormPeopletagsXHR($(this).parents('form')); return false;
 +            });
 +        },
 +
+         /**
+          * Set up any generic 'ajax' form so it submits via AJAX with auto-replacement.
+          */
+         AjaxForms: function() {
+             $('form.ajax').live('submit', function() {
+                 SN.U.FormXHR($(this));
+                 return false;
+             });
+         },
          /**
           * Add logic to any file upload forms to handle file size limits,
           * on browsers that support basic FileAPI.
diff --cc js/util.min.js
index a31d366d7bdaac46d0ae82a9365ea8ee016165d6,0f81741830d759766030c2e45dd27fc6bf890951..cfc06cda5ac6f9df21f3a3fdf1ddb32019173172
@@@ -1,1 -1,1 +1,1 @@@
- var SN={C:{I:{CounterBlackout:false,MaxLength:140,PatternUsername:/^[0-9a-zA-Z\-_.]*$/,HTTP20x30x:[200,201,202,203,204,205,206,300,301,302,303,304,305,306,307]},S:{Disabled:"disabled",Warning:"warning",Error:"error",Success:"success",Processing:"processing",CommandResult:"command_result",FormNotice:"form_notice",NoticeDataGeo:"notice_data-geo",NoticeDataGeoCookie:"NoticeDataGeo",NoticeDataGeoSelected:"notice_data-geo_selected",StatusNetInstance:"StatusNetInstance"}},messages:{},msg:function(a){if(typeof SN.messages[a]=="undefined"){return"["+a+"]"}else{return SN.messages[a]}},U:{FormNoticeEnhancements:function(b){if(jQuery.data(b[0],"ElementData")===undefined){MaxLength=b.find(".count").text();if(typeof(MaxLength)=="undefined"){MaxLength=SN.C.I.MaxLength}jQuery.data(b[0],"ElementData",{MaxLength:MaxLength});SN.U.Counter(b);NDT=b.find("[name=status_textarea]");NDT.bind("keyup",function(c){SN.U.Counter(b)});var a=function(c){window.setTimeout(function(){SN.U.Counter(b)},50)};NDT.bind("cut",a).bind("paste",a)}else{b.find(".count").text(jQuery.data(b[0],"ElementData").MaxLength)}},Counter:function(d){SN.C.I.FormNoticeCurrent=d;var b=jQuery.data(d[0],"ElementData").MaxLength;if(b<=0){return}var c=b-SN.U.CharacterCount(d);var a=d.find(".count");if(c.toString()!=a.text()){if(!SN.C.I.CounterBlackout||c===0){if(a.text()!=String(c)){a.text(c)}if(c<0){d.addClass(SN.C.S.Warning)}else{d.removeClass(SN.C.S.Warning)}if(!SN.C.I.CounterBlackout){SN.C.I.CounterBlackout=true;SN.C.I.FormNoticeCurrent=d;window.setTimeout("SN.U.ClearCounterBlackout(SN.C.I.FormNoticeCurrent);",500)}}}},CharacterCount:function(a){return a.find("[name=status_textarea]").val().length},ClearCounterBlackout:function(a){SN.C.I.CounterBlackout=false;SN.U.Counter(a)},RewriteAjaxAction:function(a){if(document.location.protocol=="https:"&&a.substr(0,5)=="http:"){return a.replace(/^http:\/\/[^:\/]+/,"https://"+document.location.host)}else{return a}},FormXHR:function(a){$.ajax({type:"POST",dataType:"xml",url:SN.U.RewriteAjaxAction(a.attr("action")),data:a.serialize()+"&ajax=1",beforeSend:function(b){a.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled)},error:function(c,d,b){alert(b||d)},success:function(b,c){if(typeof($("form",b)[0])!="undefined"){form_new=document._importNode($("form",b)[0],true);a.replaceWith(form_new)}else{a.replaceWith(document._importNode($("p",b)[0],true))}}})},FormNoticeXHR:function(b){SN.C.I.NoticeDataGeo={};b.append('<input type="hidden" name="ajax" value="1"/>');b.attr("action",SN.U.RewriteAjaxAction(b.attr("action")));var c=function(d,e){b.append($('<p class="form_response"></p>').addClass(d).text(e))};var a=function(){b.find(".form_response").remove()};b.ajaxForm({dataType:"xml",timeout:"60000",beforeSend:function(d){if(b.find("[name=status_textarea]").val()==""){b.addClass(SN.C.S.Warning);return false}b.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled);SN.U.normalizeGeoData(b);return true},error:function(f,g,e){b.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).removeAttr(SN.C.S.Disabled,SN.C.S.Disabled);a();if(g=="timeout"){c("error","Sorry! We had trouble sending your notice. The servers are overloaded. Please try again, and contact the site administrator if this problem persists.")}else{var d=SN.U.GetResponseXML(f);if($("."+SN.C.S.Error,d).length>0){b.append(document._importNode($("."+SN.C.S.Error,d)[0],true))}else{if(parseInt(f.status)===0||jQuery.inArray(parseInt(f.status),SN.C.I.HTTP20x30x)>=0){b.resetForm().find(".attach-status").remove();SN.U.FormNoticeEnhancements(b)}else{c("error","(Sorry! We had trouble sending your notice ("+f.status+" "+f.statusText+"). Please report the problem to the site administrator if this happens again.")}}}},success:function(i,f){a();var n=$("#"+SN.C.S.Error,i);if(n.length>0){c("error",n.text())}else{if($("body")[0].id=="bookmarklet"){self.close()}var d=$("#"+SN.C.S.CommandResult,i);if(d.length>0){c("success",d.text())}else{var m=document._importNode($("li",i)[0],true);var k=$("#notices_primary .notices:first");var l=b.closest("li.notice-reply");if(l.length>0){var e=$(m).attr("id");if($("#"+e).length==0){var j=l.closest("li.notice");l.replaceWith(m);SN.U.NoticeInlineReplyPlaceholder(j)}else{l.remove()}}else{if(k.length>0&&SN.U.belongsOnTimeline(m)){if($("#"+m.id).length===0){var h=b.find("[name=inreplyto]").val();var g="#notices_primary #notice-"+h;if($("body")[0].id=="conversation"){if(h.length>0&&$(g+" .notices").length<1){$(g).append('<ul class="notices"></ul>')}$($(g+" .notices")[0]).append(m)}else{k.prepend(m)}$("#"+m.id).css({display:"none"}).fadeIn(2500);SN.U.NoticeWithAttachment($("#"+m.id));SN.U.NoticeReplyTo($("#"+m.id))}}else{c("success",$("title",i).text())}}}b.resetForm();b.find("[name=inreplyto]").val("");b.find(".attach-status").remove();SN.U.FormNoticeEnhancements(b)}},complete:function(d,e){b.removeClass(SN.C.S.Processing).find(".submit").removeAttr(SN.C.S.Disabled).removeClass(SN.C.S.Disabled);b.find("[name=lat]").val(SN.C.I.NoticeDataGeo.NLat);b.find("[name=lon]").val(SN.C.I.NoticeDataGeo.NLon);b.find("[name=location_ns]").val(SN.C.I.NoticeDataGeo.NLNS);b.find("[name=location_id]").val(SN.C.I.NoticeDataGeo.NLID);b.find("[name=notice_data-geo]").attr("checked",SN.C.I.NoticeDataGeo.NDG)}})},FormProfileSearchXHR:function(a){$.ajax({type:"POST",dataType:"xml",url:a.attr("action"),data:a.serialize()+"&ajax=1",beforeSend:function(b){a.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled)},error:function(c,d,b){alert(b||d)},success:function(d,f){var b=$("#profile_search_results");if(typeof($("ul",d)[0])!="undefined"){var c=document._importNode($("ul",d)[0],true);b.replaceWith(c)}else{var e=$("<li/>").append(document._importNode($("p",d)[0],true));b.html(e)}a.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,false)}})},FormPeopletagsXHR:function(a){$.ajax({type:"POST",dataType:"xml",url:a.attr("action"),data:a.serialize()+"&ajax=1",beforeSend:function(b){a.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled)},error:function(c,d,b){alert(b||d)},success:function(d,e){var c=a.parents(".entity_tags");if(typeof($(".entity_tags",d)[0])!="undefined"){var b=document._importNode($(".entity_tags",d)[0],true);$(b).find(".editable").append($('<button class="peopletags_edit_button"/>'));c.replaceWith(b)}else{c.find("p").remove();c.append(document._importNode($("p",d)[0],true));a.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,false)}}})},normalizeGeoData:function(a){SN.C.I.NoticeDataGeo.NLat=a.find("[name=lat]").val();SN.C.I.NoticeDataGeo.NLon=a.find("[name=lon]").val();SN.C.I.NoticeDataGeo.NLNS=a.find("[name=location_ns]").val();SN.C.I.NoticeDataGeo.NLID=a.find("[name=location_id]").val();SN.C.I.NoticeDataGeo.NDG=a.find("[name=notice_data-geo]").attr("checked");var b=$.cookie(SN.C.S.NoticeDataGeoCookie);if(b!==null&&b!="disabled"){b=JSON.parse(b);SN.C.I.NoticeDataGeo.NLat=a.find("[name=lat]").val(b.NLat).val();SN.C.I.NoticeDataGeo.NLon=a.find("[name=lon]").val(b.NLon).val();if(b.NLNS){SN.C.I.NoticeDataGeo.NLNS=a.find("[name=location_ns]").val(b.NLNS).val();SN.C.I.NoticeDataGeo.NLID=a.find("[name=location_id]").val(b.NLID).val()}else{a.find("[name=location_ns]").val("");a.find("[name=location_id]").val("")}}if(b=="disabled"){SN.C.I.NoticeDataGeo.NDG=a.find("[name=notice_data-geo]").attr("checked",false).attr("checked")}else{SN.C.I.NoticeDataGeo.NDG=a.find("[name=notice_data-geo]").attr("checked",true).attr("checked")}},GetResponseXML:function(b){try{return b.responseXML}catch(a){return(new DOMParser()).parseFromString(b.responseText,"text/xml")}},NoticeReply:function(){if($("#content .notice_reply").length>0){$("#content .notice").each(function(){SN.U.NoticeReplyTo($(this))})}},NoticeReplyTo:function(a){a.find(".notice_reply").live("click",function(c){c.preventDefault();var b=($(".author .nickname",a).length>0)?$($(".author .nickname",a)[0]):$(".author .nickname.uid");SN.U.NoticeInlineReplyTrigger(a,"@"+b.text());return false})},NoticeInlineReplyTrigger:function(g,h){var b=$($(".notice_id",g)[0]).text();var d=g;var e=g.closest(".notices");if(e.hasClass("threaded-replies")){d=e.closest(".notice")}else{e=$("ul.threaded-replies",g);if(e.length==0){e=$('<ul class="notices threaded-replies xoxo"></ul>');g.append(e)}}var i=$(".notice-reply-form",e);var c=function(){i.find("input[name=inreplyto]").val(b);var l=i.find("textarea");if(l.length==0){throw"No textarea"}var k="";if(h){k=h+" "}l.val(k+l.val().replace(RegExp(k,"i"),""));l.data("initialText",$.trim(h+""));l.focus();if(l[0].setSelectionRange){var j=l.val().length;l[0].setSelectionRange(j,j)}};if(i.length>0){c()}else{$("li.notice-reply-placeholder").remove();var f=$("li.notice-reply",e);if(f.length==0){var a=$("#form_notice").attr("action");f=$('<li class="notice-reply"></li>');$.get(a,{ajax:1},function(l,n,m){var j=document._importNode($("form",l)[0],true);f.append(j);e.append(f);var k=i=$(j);SN.U.NoticeLocationAttach(k);SN.U.FormNoticeXHR(k);SN.U.FormNoticeEnhancements(k);SN.U.NoticeDataAttach(k);c()})}}},NoticeFavor:function(){$(".form_favor").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_disfavor").live("click",function(){SN.U.FormXHR($(this));return false})},NoticeInlineReplyPlaceholder:function(b){var a=b.find("ul.threaded-replies");var c=$('<li class="notice-reply-placeholder"><input class="placeholder"></li>');c.click(function(){SN.U.NoticeInlineReplyTrigger(b)});c.find("input").val(SN.msg("reply_placeholder"));a.append(c)},NoticeInlineReplySetup:function(){$(".threaded-replies").each(function(){var b=$(this);var a=b.closest(".notice");SN.U.NoticeInlineReplyPlaceholder(a)})},NoticeRepeat:function(){$(".form_repeat").live("click",function(a){a.preventDefault();SN.U.NoticeRepeatConfirmation($(this));return false})},NoticeRepeatConfirmation:function(a){var c=a.find(".submit");var b=c.clone();b.addClass("submit_dialogbox").removeClass("submit");a.append(b);b.bind("click",function(){SN.U.FormXHR(a);return false});c.hide();a.addClass("dialogbox").append('<button class="close">&#215;</button>').closest(".notice-options").addClass("opaque");a.find("button.close").click(function(){$(this).remove();a.removeClass("dialogbox").closest(".notice-options").removeClass("opaque");a.find(".submit_dialogbox").remove();a.find(".submit").show();return false})},NoticeAttachments:function(){$(".notice a.attachment").each(function(){SN.U.NoticeWithAttachment($(this).closest(".notice"))})},NoticeWithAttachment:function(b){if(b.find(".attachment").length===0){return}var a=b.find(".attachment.more");if(a.length>0){$(a[0]).click(function(){var c=$(this);c.addClass(SN.C.S.Processing);$.get(c.attr("href")+"/ajax",null,function(d){c.parent(".entry-content").html($(d).find("#attachment_view .entry-content").html())});return false}).attr("title",SN.msg("showmore_tooltip"))}},NoticeDataAttach:function(b){var a=b.find("input[type=file]");a.change(function(f){b.find(".attach-status").remove();var d=$(this).val();if(!d){return false}var c=$('<div class="attach-status '+SN.C.S.Success+'"><code></code> <button class="close">&#215;</button></div>');c.find("code").text(d);c.find("button").click(function(){c.remove();a.val("");return false});b.append(c);if(typeof this.files=="object"){for(var e=0;e<this.files.length;e++){SN.U.PreviewAttach(b,this.files[e])}}})},maxFileSize:function(b){var a=$(b).find("input[name=MAX_FILE_SIZE]").attr("value");if(a){return parseInt(a)}else{return 0}},PreviewAttach:function(d,c){var e=c.type+" "+Math.round(c.size/1024)+"KB";var f=true;var h;if(typeof window.createObjectURL!="undefined"){h=function(i,j){j(window.createObjectURL(i))}}else{if(typeof window.FileReader!="undefined"){h=function(j,k){var i=new FileReader();i.onload=function(l){k(i.result)};i.readAsDataURL(j)}}else{f=false}}var a=["image/png","image/jpeg","image/gif","image/svg+xml"];if($.inArray(c.type,a)==-1){f=false}var g=8*1024*1024;if(c.size>g){f=false}if(f){h(c,function(j){var i=$("<img>").attr("title",e).attr("alt",e).attr("src",j).attr("style","height: 120px");d.find(".attach-status").append(i)})}else{var b=$("<div></div>").text(e);d.find(".attach-status").append(b)}},NoticeLocationAttach:function(a){var e=a.find("[name=lat]");var k=a.find("[name=lon]");var g=a.find("[name=location_ns]").val();var l=a.find("[name=location_id]").val();var b="";var d=a.find("[name=notice_data-geo]");var c=a.find("[name=notice_data-geo]");var j=a.find("label.notice_data-geo");function f(n){j.attr("title",jQuery.trim(j.text())).removeClass("checked");a.find("[name=lat]").val("");a.find("[name=lon]").val("");a.find("[name=location_ns]").val("");a.find("[name=location_id]").val("");a.find("[name=notice_data-geo]").attr("checked",false);$.cookie(SN.C.S.NoticeDataGeoCookie,"disabled",{path:"/"});if(n){a.find(".geo_status_wrapper").removeClass("success").addClass("error");a.find(".geo_status_wrapper .geo_status").text(n)}else{a.find(".geo_status_wrapper").remove()}}function m(n,o){SN.U.NoticeGeoStatus(a,"Looking up place name...");$.getJSON(n,o,function(p){var q,r;if(typeof(p.location_ns)!="undefined"){a.find("[name=location_ns]").val(p.location_ns);q=p.location_ns}if(typeof(p.location_id)!="undefined"){a.find("[name=location_id]").val(p.location_id);r=p.location_id}if(typeof(p.name)=="undefined"){NLN_text=o.lat+";"+o.lon}else{NLN_text=p.name}SN.U.NoticeGeoStatus(a,NLN_text,o.lat,o.lon,p.url);j.attr("title",NoticeDataGeo_text.ShareDisable+" ("+NLN_text+")");a.find("[name=lat]").val(o.lat);a.find("[name=lon]").val(o.lon);a.find("[name=location_ns]").val(q);a.find("[name=location_id]").val(r);a.find("[name=notice_data-geo]").attr("checked",true);var s={NLat:o.lat,NLon:o.lon,NLNS:q,NLID:r,NLN:NLN_text,NLNU:p.url,NDG:true};$.cookie(SN.C.S.NoticeDataGeoCookie,JSON.stringify(s),{path:"/"})})}if(c.length>0){if($.cookie(SN.C.S.NoticeDataGeoCookie)=="disabled"){c.attr("checked",false)}else{c.attr("checked",true)}var h=a.find(".notice_data-geo_wrap");var i=h.attr("title");h.removeAttr("title");j.attr("title",j.text());c.change(function(){if(c.attr("checked")===true||$.cookie(SN.C.S.NoticeDataGeoCookie)===null){j.attr("title",NoticeDataGeo_text.ShareDisable).addClass("checked");if($.cookie(SN.C.S.NoticeDataGeoCookie)===null||$.cookie(SN.C.S.NoticeDataGeoCookie)=="disabled"){if(navigator.geolocation){SN.U.NoticeGeoStatus(a,"Requesting location from browser...");navigator.geolocation.getCurrentPosition(function(p){a.find("[name=lat]").val(p.coords.latitude);a.find("[name=lon]").val(p.coords.longitude);var q={lat:p.coords.latitude,lon:p.coords.longitude,token:$("#token").val()};m(i,q)},function(p){switch(p.code){case p.PERMISSION_DENIED:f("Location permission denied.");break;case p.TIMEOUT:f("Location lookup timeout.");break}},{timeout:10000})}else{if(e.length>0&&k.length>0){var n={lat:e,lon:k,token:$("#token").val()};m(i,n)}else{f();c.remove();j.remove()}}}else{var o=JSON.parse($.cookie(SN.C.S.NoticeDataGeoCookie));a.find("[name=lat]").val(o.NLat);a.find("[name=lon]").val(o.NLon);a.find("[name=location_ns]").val(o.NLNS);a.find("[name=location_id]").val(o.NLID);a.find("[name=notice_data-geo]").attr("checked",o.NDG);SN.U.NoticeGeoStatus(a,o.NLN,o.NLat,o.NLon,o.NLNU);j.attr("title",NoticeDataGeo_text.ShareDisable+" ("+o.NLN+")").addClass("checked")}}else{f()}}).change()}},NoticeGeoStatus:function(e,a,f,g,c){var h=e.find(".geo_status_wrapper");if(h.length==0){h=$('<div class="'+SN.C.S.Success+' geo_status_wrapper"><button class="close" style="float:right">&#215;</button><div class="geo_status"></div></div>');h.find("button.close").click(function(){e.find("[name=notice_data-geo]").removeAttr("checked").change()});e.append(h)}var b;if(c){b=$("<a></a>").attr("href",c)}else{b=$("<span></span>")}b.text(a);if(f||g){var d=f+";"+g;b.attr("title",d);if(!a){b.text(d)}}h.find(".geo_status").empty().append(b)},NewDirectMessage:function(){NDM=$(".entity_send-a-message a");NDM.attr({href:NDM.attr("href")+"&ajax=1"});NDM.bind("click",function(){var a=$(".entity_send-a-message form");if(a.length===0){$(this).addClass(SN.C.S.Processing);$.get(NDM.attr("href"),null,function(b){$(".entity_send-a-message").append(document._importNode($("form",b)[0],true));a=$(".entity_send-a-message .form_notice");SN.U.FormNoticeXHR(a);SN.U.FormNoticeEnhancements(a);a.append('<button class="close">&#215;</button>');$(".entity_send-a-message button").click(function(){a.hide();return false});NDM.removeClass(SN.C.S.Processing)})}else{a.show();$(".entity_send-a-message textarea").focus()}return false})},GetFullYear:function(c,d,a){var b=new Date();b.setFullYear(c,d,a);return b},StatusNetInstance:{Set:function(b){var a=SN.U.StatusNetInstance.Get();if(a!==null){b=$.extend(a,b)}$.cookie(SN.C.S.StatusNetInstance,JSON.stringify(b),{path:"/",expires:SN.U.GetFullYear(2029,0,1)})},Get:function(){var a=$.cookie(SN.C.S.StatusNetInstance);if(a!==null){return JSON.parse(a)}return null},Delete:function(){$.cookie(SN.C.S.StatusNetInstance,null)}},belongsOnTimeline:function(b){var a=$("body").attr("id");if(a=="public"){return true}var c=$("#nav_profile a").attr("href");if(c){var d=$(b).find(".entry-title .author a.url").attr("href");if(d==c){if(a=="all"||a=="showstream"){return true}}}return false}},Init:{NoticeForm:function(){if($("body.user_in").length>0){$("."+SN.C.S.FormNotice).each(function(){var a=$(this);SN.U.NoticeLocationAttach(a);SN.U.FormNoticeXHR(a);SN.U.FormNoticeEnhancements(a);SN.U.NoticeDataAttach(a)})}},Notices:function(){if($("body.user_in").length>0){SN.U.NoticeFavor();SN.U.NoticeRepeat();SN.U.NoticeReply();SN.U.NoticeInlineReplySetup()}SN.U.NoticeAttachments()},EntityActions:function(){if($("body.user_in").length>0){$(".form_user_subscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_unsubscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_group_join").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_group_leave").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_nudge").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_peopletag_subscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_peopletag_unsubscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_add_peopletag").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_remove_peopletag").live("click",function(){SN.U.FormXHR($(this));return false});SN.U.NewDirectMessage()}},ProfileSearch:function(){if($("body.user_in").length>0){$(".form_peopletag_edit_user_search input.submit").live("click",function(){SN.U.FormProfileSearchXHR($(this).parents("form"));return false})}},Login:function(){if(SN.U.StatusNetInstance.Get()!==null){var a=SN.U.StatusNetInstance.Get().Nickname;if(a!==null){$("#form_login #nickname").val(a)}}$("#form_login").bind("submit",function(){SN.U.StatusNetInstance.Set({Nickname:$("#form_login #nickname").val()});return true})},PeopletagAutocomplete:function(){$(".form_tag_user #tags").tagInput({tags:SN.C.PtagACData,tagSeparator:" ",animate:false,formatLine:function(d,g,c,f){var a="<b>"+g.tag.substring(0,c.length)+"</b>"+g.tag.substring(c.length);var b=$("<div/>").addClass("mode-"+g.mode);b.append($("<div class='tagInputLineTag'>"+a+" <em class='privacy_mode'>"+g.mode+"</em></div>"));if(g.freq){b.append("<div class='tagInputLineFreq'>"+g.freq+"</div>")}return b}})},PeopleTags:function(){$(".user_profile_tags .editable").append($('<button class="peopletags_edit_button"/>'));$(".peopletags_edit_button").live("click",function(){var a=$(this).parents("dd").eq(0).find("form");if(typeof SN.C.PtagACData==="undefined"){$.getJSON(_peopletagAC+"?token="+$("#token").val(),function(b){SN.C.PtagACData=b;_loadTagInput(SN.Init.PeopletagAutocomplete)})}else{_loadTagInput(SN.Init.PeopletagAutocomplete)}$(this).parents("ul").eq(0).fadeOut(200,function(){a.fadeIn(200).find("input#tags")})});$(".user_profile_tags form .submit").live("click",function(){SN.U.FormPeopletagsXHR($(this).parents("form"));return false})},UploadForms:function(){$("input[type=file]").change(function(d){if(typeof this.files=="object"&&this.files.length>0){var c=0;for(var b=0;b<this.files.length;b++){c+=this.files[b].size}var a=SN.U.maxFileSize($(this.form));if(a>0&&c>a){var e="File too large: maximum upload size is %d bytes.";alert(e.replace("%d",a));$(this).val("");d.preventDefault();return false}}})}}};$(document).ready(function(){SN.Init.UploadForms();if($("."+SN.C.S.FormNotice).length>0){SN.Init.NoticeForm()}if($("#content .notices").length>0){SN.Init.Notices()}if($("#content .entity_actions").length>0){SN.Init.EntityActions()}if($("#form_login").length>0){SN.Init.Login()}if($("#profile_search_results").length>0){SN.Init.ProfileSearch()}if($(".user_profile_tags .editable").length>0){SN.Init.PeopleTags()}});if(!document.ELEMENT_NODE){document.ELEMENT_NODE=1;document.ATTRIBUTE_NODE=2;document.TEXT_NODE=3;document.CDATA_SECTION_NODE=4;document.ENTITY_REFERENCE_NODE=5;document.ENTITY_NODE=6;document.PROCESSING_INSTRUCTION_NODE=7;document.COMMENT_NODE=8;document.DOCUMENT_NODE=9;document.DOCUMENT_TYPE_NODE=10;document.DOCUMENT_FRAGMENT_NODE=11;document.NOTATION_NODE=12}document._importNode=function(e,a){switch(e.nodeType){case document.ELEMENT_NODE:var d=document.createElement(e.nodeName);if(e.attributes&&e.attributes.length>0){for(var c=0,b=e.attributes.length;c<b;){if(e.attributes[c].nodeName=="class"){d.className=e.getAttribute(e.attributes[c++].nodeName)}else{d.setAttribute(e.attributes[c].nodeName,e.getAttribute(e.attributes[c++].nodeName))}}}if(a&&e.childNodes&&e.childNodes.length>0){for(var c=0,b=e.childNodes.length;c<b;){d.appendChild(document._importNode(e.childNodes[c++],a))}}return d;break;case document.TEXT_NODE:case document.CDATA_SECTION_NODE:case document.COMMENT_NODE:return document.createTextNode(e.nodeValue);break}};if(typeof navigator.geolocation=="undefined"||navigator.geolocation.shim){(function(){(function(){if(window.google&&google.gears){return}var c=null;if(typeof GearsFactory!="undefined"){c=new GearsFactory()}else{try{c=new ActiveXObject("Gears.Factory");if(c.getBuildInfo().indexOf("ie_mobile")!=-1){c.privateSetGlobalObject(this)}}catch(d){if((typeof navigator.mimeTypes!="undefined")&&navigator.mimeTypes["application/x-googlegears"]){c=document.createElement("object");c.style.display="none";c.width=0;c.height=0;c.type="application/x-googlegears";document.documentElement.appendChild(c)}}}if(!c){return}if(!window.google){google={}}if(!google.gears){google.gears={factory:c}}})();var a=(function(){var d=google.gears.factory.create("beta.geolocation");var c=function(f,e){return function(g){f(g);e.lastPosition=g}};return{shim:true,type:"Gears",lastPosition:null,getCurrentPosition:function(e,g,h){var f=this;var i=c(e,f);d.getCurrentPosition(i,g,h)},watchPosition:function(e,f,g){d.watchPosition(e,f,g)},clearWatch:function(e){d.clearWatch(e)},getPermission:function(g,e,f){d.getPermission(g,e,f)}}});var b=(function(){var i=false;var e=function(){if(!d()&&!i){i=true;var j=document.createElement("script");j.src=(document.location.protocol=="https:"?"https://":"http://")+"www.google.com/jsapi?callback=_google_loader_apiLoaded";j.type="text/javascript";document.getElementsByTagName("body")[0].appendChild(j)}};var c=[];var h=function(j){c.push(j)};var f=function(){if(d()){while(c.length>0){var j=c.pop();j()}}};window._google_loader_apiLoaded=function(){f()};var d=function(){return(window.google&&google.loader)};var g=function(j){if(d()){return true}h(j);e();return false};e();return{shim:true,type:"ClientLocation",lastPosition:null,getCurrentPosition:function(k,n,o){var m=this;if(!g(function(){m.getCurrentPosition(k,n,o)})){return}if(google.loader.ClientLocation){var l=google.loader.ClientLocation;var j={coords:{latitude:l.latitude,longitude:l.longitude,altitude:null,accuracy:43000,altitudeAccuracy:null,heading:null,speed:null},address:{city:l.address.city,country:l.address.country,country_code:l.address.country_code,region:l.address.region},timestamp:new Date()};k(j);this.lastPosition=j}else{if(n==="function"){n({code:3,message:"Using the Google ClientLocation API and it is not able to calculate a location."})}}},watchPosition:function(j,l,m){this.getCurrentPosition(j,l,m);var k=this;var n=setInterval(function(){k.getCurrentPosition(j,l,m)},10000);return n},clearWatch:function(j){clearInterval(j)},getPermission:function(l,j,k){return true}}});navigator.geolocation=(window.google&&google.gears)?a():b()})()};
 -var SN={C:{I:{CounterBlackout:false,MaxLength:140,PatternUsername:/^[0-9a-zA-Z\-_.]*$/,HTTP20x30x:[200,201,202,203,204,205,206,300,301,302,303,304,305,306,307],NoticeFormMaster:null},S:{Disabled:"disabled",Warning:"warning",Error:"error",Success:"success",Processing:"processing",CommandResult:"command_result",FormNotice:"form_notice",NoticeDataGeo:"notice_data-geo",NoticeDataGeoCookie:"NoticeDataGeo",NoticeDataGeoSelected:"notice_data-geo_selected",StatusNetInstance:"StatusNetInstance"}},messages:{},msg:function(a){if(typeof SN.messages[a]=="undefined"){return"["+a+"]"}else{return SN.messages[a]}},U:{FormNoticeEnhancements:function(b){if(jQuery.data(b[0],"ElementData")===undefined){MaxLength=b.find(".count").text();if(typeof(MaxLength)=="undefined"){MaxLength=SN.C.I.MaxLength}jQuery.data(b[0],"ElementData",{MaxLength:MaxLength});SN.U.Counter(b);NDT=b.find(".notice_data-text:first");NDT.bind("keyup",function(c){SN.U.Counter(b)});var a=function(c){window.setTimeout(function(){SN.U.Counter(b)},50)};NDT.bind("cut",a).bind("paste",a)}else{b.find(".count").text(jQuery.data(b[0],"ElementData").MaxLength)}},Counter:function(d){SN.C.I.FormNoticeCurrent=d;var b=jQuery.data(d[0],"ElementData").MaxLength;if(b<=0){return}var c=b-SN.U.CharacterCount(d);var a=d.find(".count");if(c.toString()!=a.text()){if(!SN.C.I.CounterBlackout||c===0){if(a.text()!=String(c)){a.text(c)}if(c<0){d.addClass(SN.C.S.Warning)}else{d.removeClass(SN.C.S.Warning)}if(!SN.C.I.CounterBlackout){SN.C.I.CounterBlackout=true;SN.C.I.FormNoticeCurrent=d;window.setTimeout("SN.U.ClearCounterBlackout(SN.C.I.FormNoticeCurrent);",500)}}}},CharacterCount:function(a){return a.find(".notice_data-text:first").val().length},ClearCounterBlackout:function(a){SN.C.I.CounterBlackout=false;SN.U.Counter(a)},RewriteAjaxAction:function(a){if(document.location.protocol=="https:"&&a.substr(0,5)=="http:"){return a.replace(/^http:\/\/[^:\/]+/,"https://"+document.location.host)}else{return a}},FormXHR:function(a){$.ajax({type:"POST",dataType:"xml",url:SN.U.RewriteAjaxAction(a.attr("action")),data:a.serialize()+"&ajax=1",beforeSend:function(b){a.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled)},error:function(d,e,c){var b=null;if(d.responseXML){b=$("#error",d.responseXML).text()}alert(b||c||e);a.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).removeAttr(SN.C.S.Disabled)},success:function(b,c){if(typeof($("form",b)[0])!="undefined"){form_new=document._importNode($("form",b)[0],true);a.replaceWith(form_new)}else{if(typeof($("p",b)[0])!="undefined"){a.replaceWith(document._importNode($("p",b)[0],true))}else{alert("Unknown error.")}}}})},FormNoticeXHR:function(b){SN.C.I.NoticeDataGeo={};b.append('<input type="hidden" name="ajax" value="1"/>');b.attr("action",SN.U.RewriteAjaxAction(b.attr("action")));var c=function(d,e){b.append($('<p class="form_response"></p>').addClass(d).text(e))};var a=function(){b.find(".form_response").remove()};b.ajaxForm({dataType:"xml",timeout:"60000",beforeSend:function(d){if(b.find(".notice_data-text:first").val()==""){b.addClass(SN.C.S.Warning);return false}b.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled);SN.U.normalizeGeoData(b);return true},error:function(f,g,e){b.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).removeAttr(SN.C.S.Disabled,SN.C.S.Disabled);a();if(g=="timeout"){c("error","Sorry! We had trouble sending your notice. The servers are overloaded. Please try again, and contact the site administrator if this problem persists.")}else{var d=SN.U.GetResponseXML(f);if($("."+SN.C.S.Error,d).length>0){b.append(document._importNode($("."+SN.C.S.Error,d)[0],true))}else{if(parseInt(f.status)===0||jQuery.inArray(parseInt(f.status),SN.C.I.HTTP20x30x)>=0){b.resetForm().find(".attach-status").remove();SN.U.FormNoticeEnhancements(b)}else{c("error","(Sorry! We had trouble sending your notice ("+f.status+" "+f.statusText+"). Please report the problem to the site administrator if this happens again.")}}}},success:function(i,f){a();var o=$("#"+SN.C.S.Error,i);if(o.length>0){c("error",o.text())}else{if($("body")[0].id=="bookmarklet"){self.close()}var d=$("#"+SN.C.S.CommandResult,i);if(d.length>0){c("success",d.text())}else{var n=document._importNode($("li",i)[0],true);var j=$("#notices_primary .notices:first");var l=b.closest("li.notice-reply");if(l.length>0){var k=b.closest(".threaded-replies");var m=k.find(".notice-reply-placeholder");l.remove();var e=$(n).attr("id");if($("#"+e).length==0){$(n).insertBefore(m)}else{}m.show()}else{if(j.length>0&&SN.U.belongsOnTimeline(n)){if($("#"+n.id).length===0){var h=b.find("[name=inreplyto]").val();var g="#notices_primary #notice-"+h;if($("body")[0].id=="conversation"){if(h.length>0&&$(g+" .notices").length<1){$(g).append('<ul class="notices"></ul>')}$($(g+" .notices")[0]).append(n)}else{j.prepend(n)}$("#"+n.id).css({display:"none"}).fadeIn(2500);SN.U.NoticeWithAttachment($("#"+n.id));SN.U.switchInputFormTab("placeholder")}}else{c("success",$("title",i).text())}}}b.resetForm();b.find("[name=inreplyto]").val("");b.find(".attach-status").remove();SN.U.FormNoticeEnhancements(b)}},complete:function(d,e){b.removeClass(SN.C.S.Processing).find(".submit").removeAttr(SN.C.S.Disabled).removeClass(SN.C.S.Disabled);b.find("[name=lat]").val(SN.C.I.NoticeDataGeo.NLat);b.find("[name=lon]").val(SN.C.I.NoticeDataGeo.NLon);b.find("[name=location_ns]").val(SN.C.I.NoticeDataGeo.NLNS);b.find("[name=location_id]").val(SN.C.I.NoticeDataGeo.NLID);b.find("[name=notice_data-geo]").attr("checked",SN.C.I.NoticeDataGeo.NDG)}})},normalizeGeoData:function(a){SN.C.I.NoticeDataGeo.NLat=a.find("[name=lat]").val();SN.C.I.NoticeDataGeo.NLon=a.find("[name=lon]").val();SN.C.I.NoticeDataGeo.NLNS=a.find("[name=location_ns]").val();SN.C.I.NoticeDataGeo.NLID=a.find("[name=location_id]").val();SN.C.I.NoticeDataGeo.NDG=a.find("[name=notice_data-geo]").attr("checked");var b=$.cookie(SN.C.S.NoticeDataGeoCookie);if(b!==null&&b!="disabled"){b=JSON.parse(b);SN.C.I.NoticeDataGeo.NLat=a.find("[name=lat]").val(b.NLat).val();SN.C.I.NoticeDataGeo.NLon=a.find("[name=lon]").val(b.NLon).val();if(b.NLNS){SN.C.I.NoticeDataGeo.NLNS=a.find("[name=location_ns]").val(b.NLNS).val();SN.C.I.NoticeDataGeo.NLID=a.find("[name=location_id]").val(b.NLID).val()}else{a.find("[name=location_ns]").val("");a.find("[name=location_id]").val("")}}if(b=="disabled"){SN.C.I.NoticeDataGeo.NDG=a.find("[name=notice_data-geo]").attr("checked",false).attr("checked")}else{SN.C.I.NoticeDataGeo.NDG=a.find("[name=notice_data-geo]").attr("checked",true).attr("checked")}},GetResponseXML:function(b){try{return b.responseXML}catch(a){return(new DOMParser()).parseFromString(b.responseText,"text/xml")}},NoticeReply:function(){$("#content .notice_reply").live("click",function(c){c.preventDefault();var b=$(this).closest("li.notice");var a=($(".author .nickname",b).length>0)?$($(".author .nickname",b)[0]):$(".author .nickname.uid");SN.U.NoticeInlineReplyTrigger(b,"@"+a.text());return false})},NoticeReplyTo:function(a){},NoticeInlineReplyTrigger:function(i,j){var b=$($(".notice_id",i)[0]).text();var e=i;var f=i.closest(".notices");if(f.hasClass("threaded-replies")){e=f.closest(".notice")}else{f=$("ul.threaded-replies",i);if(f.length==0){f=$('<ul class="notices threaded-replies xoxo"></ul>');i.append(f)}}var k=$(".notice-reply-form",f);var d=function(){k.find("input[name=inreplyto]").val(b);var n=k.find("textarea");if(n.length==0){throw"No textarea"}var m="";if(j){m=j+" "}n.val(m+n.val().replace(RegExp(m,"i"),""));n.data("initialText",$.trim(j+""));n.focus();if(n[0].setSelectionRange){var l=n.val().length;n[0].setSelectionRange(l,l)}};if(k.length>0){d()}else{var h=f.find("li.notice-reply-placeholder").hide();var g=$("li.notice-reply",f);if(g.length==0){g=$('<li class="notice-reply"></li>');var c=function(l){var m=document._importNode(l,true);g.append(m);f.append(g);var n=k=$(m);SN.Init.NoticeFormSetup(n);d()};if(SN.C.I.NoticeFormMaster){c(SN.C.I.NoticeFormMaster)}else{var a=$("#form_notice").attr("action");$.get(a,{ajax:1},function(l,n,m){c($("form",l)[0])})}}}},NoticeInlineReplyPlaceholder:function(b){var a=b.find("ul.threaded-replies");var c=$('<li class="notice-reply-placeholder"><input class="placeholder"></li>');c.find("input").val(SN.msg("reply_placeholder"));a.append(c)},NoticeInlineReplySetup:function(){$("li.notice-reply-placeholder input").live("focus",function(){var a=$(this).closest("li.notice");SN.U.NoticeInlineReplyTrigger(a);return false});$("li.notice-reply-comments a").live("click",function(){var a=$(this).attr("href");var b=$(this).closest(".threaded-replies");$.get(a,{ajax:1},function(d,f,e){var c=$(".threaded-replies",d);if(c.length){b.replaceWith(document._importNode(c[0],true))}});return false})},NoticeRepeat:function(){$(".form_repeat").live("click",function(a){a.preventDefault();SN.U.NoticeRepeatConfirmation($(this));return false})},NoticeRepeatConfirmation:function(a){var c=a.find(".submit");var b=c.clone();b.addClass("submit_dialogbox").removeClass("submit");a.append(b);b.bind("click",function(){SN.U.FormXHR(a);return false});c.hide();a.addClass("dialogbox").append('<button class="close">&#215;</button>').closest(".notice-options").addClass("opaque");a.find("button.close").click(function(){$(this).remove();a.removeClass("dialogbox").closest(".notice-options").removeClass("opaque");a.find(".submit_dialogbox").remove();a.find(".submit").show();return false})},NoticeAttachments:function(){$(".notice a.attachment").each(function(){SN.U.NoticeWithAttachment($(this).closest(".notice"))})},NoticeWithAttachment:function(b){if(b.find(".attachment").length===0){return}var a=b.find(".attachment.more");if(a.length>0){$(a[0]).click(function(){var c=$(this);c.addClass(SN.C.S.Processing);$.get(c.attr("href")+"/ajax",null,function(d){c.parent(".entry-content").html($(d).find("#attachment_view .entry-content").html())});return false}).attr("title",SN.msg("showmore_tooltip"))}},NoticeDataAttach:function(b){var a=b.find("input[type=file]");a.change(function(f){b.find(".attach-status").remove();var d=$(this).val();if(!d){return false}var c=$('<div class="attach-status '+SN.C.S.Success+'"><code></code> <button class="close">&#215;</button></div>');c.find("code").text(d);c.find("button").click(function(){c.remove();a.val("");return false});b.append(c);if(typeof this.files=="object"){for(var e=0;e<this.files.length;e++){SN.U.PreviewAttach(b,this.files[e])}}})},maxFileSize:function(b){var a=$(b).find("input[name=MAX_FILE_SIZE]").attr("value");if(a){return parseInt(a)}else{return 0}},PreviewAttach:function(d,c){var e=c.type+" "+Math.round(c.size/1024)+"KB";var f=true;var h;if(typeof window.createObjectURL!="undefined"){h=function(i,j){j(window.createObjectURL(i))}}else{if(typeof window.FileReader!="undefined"){h=function(j,k){var i=new FileReader();i.onload=function(l){k(i.result)};i.readAsDataURL(j)}}else{f=false}}var a=["image/png","image/jpeg","image/gif","image/svg+xml"];if($.inArray(c.type,a)==-1){f=false}var g=8*1024*1024;if(c.size>g){f=false}if(f){h(c,function(j){var i=$("<img>").attr("title",e).attr("alt",e).attr("src",j).attr("style","height: 120px");d.find(".attach-status").append(i)})}else{var b=$("<div></div>").text(e);d.find(".attach-status").append(b)}},NoticeLocationAttach:function(a){var e=a.find("[name=lat]");var k=a.find("[name=lon]");var g=a.find("[name=location_ns]").val();var l=a.find("[name=location_id]").val();var b="";var d=a.find("[name=notice_data-geo]");var c=a.find("[name=notice_data-geo]");var j=a.find("label.notice_data-geo");function f(n){j.attr("title",jQuery.trim(j.text())).removeClass("checked");a.find("[name=lat]").val("");a.find("[name=lon]").val("");a.find("[name=location_ns]").val("");a.find("[name=location_id]").val("");a.find("[name=notice_data-geo]").attr("checked",false);$.cookie(SN.C.S.NoticeDataGeoCookie,"disabled",{path:"/"});if(n){a.find(".geo_status_wrapper").removeClass("success").addClass("error");a.find(".geo_status_wrapper .geo_status").text(n)}else{a.find(".geo_status_wrapper").remove()}}function m(n,o){SN.U.NoticeGeoStatus(a,"Looking up place name...");$.getJSON(n,o,function(p){var q,r;if(typeof(p.location_ns)!="undefined"){a.find("[name=location_ns]").val(p.location_ns);q=p.location_ns}if(typeof(p.location_id)!="undefined"){a.find("[name=location_id]").val(p.location_id);r=p.location_id}if(typeof(p.name)=="undefined"){NLN_text=o.lat+";"+o.lon}else{NLN_text=p.name}SN.U.NoticeGeoStatus(a,NLN_text,o.lat,o.lon,p.url);j.attr("title",NoticeDataGeo_text.ShareDisable+" ("+NLN_text+")");a.find("[name=lat]").val(o.lat);a.find("[name=lon]").val(o.lon);a.find("[name=location_ns]").val(q);a.find("[name=location_id]").val(r);a.find("[name=notice_data-geo]").attr("checked",true);var s={NLat:o.lat,NLon:o.lon,NLNS:q,NLID:r,NLN:NLN_text,NLNU:p.url,NDG:true};$.cookie(SN.C.S.NoticeDataGeoCookie,JSON.stringify(s),{path:"/"})})}if(c.length>0){if($.cookie(SN.C.S.NoticeDataGeoCookie)=="disabled"){c.attr("checked",false)}else{c.attr("checked",true)}var h=a.find(".notice_data-geo_wrap");var i=h.attr("data-api");j.attr("title",j.text());c.change(function(){if(c.attr("checked")===true||$.cookie(SN.C.S.NoticeDataGeoCookie)===null){j.attr("title",NoticeDataGeo_text.ShareDisable).addClass("checked");if($.cookie(SN.C.S.NoticeDataGeoCookie)===null||$.cookie(SN.C.S.NoticeDataGeoCookie)=="disabled"){if(navigator.geolocation){SN.U.NoticeGeoStatus(a,"Requesting location from browser...");navigator.geolocation.getCurrentPosition(function(p){a.find("[name=lat]").val(p.coords.latitude);a.find("[name=lon]").val(p.coords.longitude);var q={lat:p.coords.latitude,lon:p.coords.longitude,token:$("#token").val()};m(i,q)},function(p){switch(p.code){case p.PERMISSION_DENIED:f("Location permission denied.");break;case p.TIMEOUT:f("Location lookup timeout.");break}},{timeout:10000})}else{if(e.length>0&&k.length>0){var n={lat:e,lon:k,token:$("#token").val()};m(i,n)}else{f();c.remove();j.remove()}}}else{var o=JSON.parse($.cookie(SN.C.S.NoticeDataGeoCookie));a.find("[name=lat]").val(o.NLat);a.find("[name=lon]").val(o.NLon);a.find("[name=location_ns]").val(o.NLNS);a.find("[name=location_id]").val(o.NLID);a.find("[name=notice_data-geo]").attr("checked",o.NDG);SN.U.NoticeGeoStatus(a,o.NLN,o.NLat,o.NLon,o.NLNU);j.attr("title",NoticeDataGeo_text.ShareDisable+" ("+o.NLN+")").addClass("checked")}}else{f()}}).change()}},NoticeGeoStatus:function(e,a,f,g,c){var h=e.find(".geo_status_wrapper");if(h.length==0){h=$('<div class="'+SN.C.S.Success+' geo_status_wrapper"><button class="close" style="float:right">&#215;</button><div class="geo_status"></div></div>');h.find("button.close").click(function(){e.find("[name=notice_data-geo]").removeAttr("checked").change();return false});e.append(h)}var b;if(c){b=$("<a></a>").attr("href",c)}else{b=$("<span></span>")}b.text(a);if(f||g){var d=f+";"+g;b.attr("title",d);if(!a){b.text(d)}}h.find(".geo_status").empty().append(b)},NewDirectMessage:function(){NDM=$(".entity_send-a-message a");NDM.attr({href:NDM.attr("href")+"&ajax=1"});NDM.bind("click",function(){var a=$(".entity_send-a-message form");if(a.length===0){$(this).addClass(SN.C.S.Processing);$.get(NDM.attr("href"),null,function(b){$(".entity_send-a-message").append(document._importNode($("form",b)[0],true));a=$(".entity_send-a-message .form_notice");SN.U.FormNoticeXHR(a);SN.U.FormNoticeEnhancements(a);a.append('<button class="close">&#215;</button>');$(".entity_send-a-message button").click(function(){a.hide();return false});NDM.removeClass(SN.C.S.Processing)})}else{a.show();$(".entity_send-a-message textarea").focus()}return false})},GetFullYear:function(c,d,a){var b=new Date();b.setFullYear(c,d,a);return b},StatusNetInstance:{Set:function(b){var a=SN.U.StatusNetInstance.Get();if(a!==null){b=$.extend(a,b)}$.cookie(SN.C.S.StatusNetInstance,JSON.stringify(b),{path:"/",expires:SN.U.GetFullYear(2029,0,1)})},Get:function(){var a=$.cookie(SN.C.S.StatusNetInstance);if(a!==null){return JSON.parse(a)}return null},Delete:function(){$.cookie(SN.C.S.StatusNetInstance,null)}},belongsOnTimeline:function(b){var a=$("body").attr("id");if(a=="public"){return true}var c=$("#nav_profile a").attr("href");if(c){var d=$(b).find(".vcard.author a.url").attr("href");if(d==c){if(a=="all"||a=="showstream"){return true}}}return false},switchInputFormTab:function(a){$(".input_form_nav_tab.current").removeClass("current");if(a=="placeholder"){$("#input_form_nav_status").addClass("current")}else{$("#input_form_nav_"+a).addClass("current")}$(".input_form.current").removeClass("current");$("#input_form_"+a).addClass("current").find(".ajax-notice").each(function(){var b=$(this);SN.Init.NoticeFormSetup(b)}).find("textarea:first").focus()}},Init:{NoticeForm:function(){if($("body.user_in").length>0){$("#input_form_placeholder input.placeholder").focus(function(){SN.U.switchInputFormTab("status")});$("body").bind("click",function(g){var d=$("#content .input_forms div.current");if(d.length>0){if($("#content .input_forms").has(g.target).length==0){var a=d.find('textarea, input[type=text], input[type=""]');var c=false;a.each(function(){c=c||$(this).val()});if(!c){SN.U.switchInputFormTab("placeholder")}}}var b=$("li.notice-reply");if(b.length>0){var f=$(g.target);b.each(function(){var j=$(this);if(j.has(g.target).length==0){var h=j.find(".notice_data-text:first");var i=$.trim(h.val());if(i==""||i==h.data("initialText")){var e=j.closest("li.notice");j.remove();e.find("li.notice-reply-placeholder").show()}}})}})}},NoticeFormSetup:function(a){if(!a.data("NoticeFormSetup")){SN.U.NoticeLocationAttach(a);SN.U.FormNoticeXHR(a);SN.U.FormNoticeEnhancements(a);SN.U.NoticeDataAttach(a);a.data("NoticeFormSetup",true)}},Notices:function(){if($("body.user_in").length>0){var a=$(".form_notice:first");if(a.length>0){SN.C.I.NoticeFormMaster=document._importNode(a[0],true)}SN.U.NoticeRepeat();SN.U.NoticeReply();SN.U.NoticeInlineReplySetup()}SN.U.NoticeAttachments()},EntityActions:function(){if($("body.user_in").length>0){SN.U.NewDirectMessage()}},Login:function(){if(SN.U.StatusNetInstance.Get()!==null){var a=SN.U.StatusNetInstance.Get().Nickname;if(a!==null){$("#form_login #nickname").val(a)}}$("#form_login").bind("submit",function(){SN.U.StatusNetInstance.Set({Nickname:$("#form_login #nickname").val()});return true})},AjaxForms:function(){$("form.ajax").live("submit",function(){SN.U.FormXHR($(this));return false})},UploadForms:function(){$("input[type=file]").change(function(d){if(typeof this.files=="object"&&this.files.length>0){var c=0;for(var b=0;b<this.files.length;b++){c+=this.files[b].size}var a=SN.U.maxFileSize($(this.form));if(a>0&&c>a){var e="File too large: maximum upload size is %d bytes.";alert(e.replace("%d",a));$(this).val("");d.preventDefault();return false}}})}}};$(document).ready(function(){SN.Init.AjaxForms();SN.Init.UploadForms();if($("."+SN.C.S.FormNotice).length>0){SN.Init.NoticeForm()}if($("#content .notices").length>0){SN.Init.Notices()}if($("#content .entity_actions").length>0){SN.Init.EntityActions()}if($("#form_login").length>0){SN.Init.Login()}});if(!document.ELEMENT_NODE){document.ELEMENT_NODE=1;document.ATTRIBUTE_NODE=2;document.TEXT_NODE=3;document.CDATA_SECTION_NODE=4;document.ENTITY_REFERENCE_NODE=5;document.ENTITY_NODE=6;document.PROCESSING_INSTRUCTION_NODE=7;document.COMMENT_NODE=8;document.DOCUMENT_NODE=9;document.DOCUMENT_TYPE_NODE=10;document.DOCUMENT_FRAGMENT_NODE=11;document.NOTATION_NODE=12}document._importNode=function(e,a){switch(e.nodeType){case document.ELEMENT_NODE:var d=document.createElement(e.nodeName);if(e.attributes&&e.attributes.length>0){for(var c=0,b=e.attributes.length;c<b;){if(e.attributes[c].nodeName=="class"){d.className=e.getAttribute(e.attributes[c++].nodeName)}else{d.setAttribute(e.attributes[c].nodeName,e.getAttribute(e.attributes[c++].nodeName))}}}if(a&&e.childNodes&&e.childNodes.length>0){for(var c=0,b=e.childNodes.length;c<b;){d.appendChild(document._importNode(e.childNodes[c++],a))}}return d;break;case document.TEXT_NODE:case document.CDATA_SECTION_NODE:case document.COMMENT_NODE:return document.createTextNode(e.nodeValue);break}};if(typeof navigator.geolocation=="undefined"||navigator.geolocation.shim){(function(){(function(){if(window.google&&google.gears){return}var c=null;if(typeof GearsFactory!="undefined"){c=new GearsFactory()}else{try{c=new ActiveXObject("Gears.Factory");if(c.getBuildInfo().indexOf("ie_mobile")!=-1){c.privateSetGlobalObject(this)}}catch(d){if((typeof navigator.mimeTypes!="undefined")&&navigator.mimeTypes["application/x-googlegears"]){c=document.createElement("object");c.style.display="none";c.width=0;c.height=0;c.type="application/x-googlegears";document.documentElement.appendChild(c)}}}if(!c){return}if(!window.google){google={}}if(!google.gears){google.gears={factory:c}}})();var a=(function(){var d=google.gears.factory.create("beta.geolocation");var c=function(f,e){return function(g){f(g);e.lastPosition=g}};return{shim:true,type:"Gears",lastPosition:null,getCurrentPosition:function(e,g,h){var f=this;var i=c(e,f);d.getCurrentPosition(i,g,h)},watchPosition:function(e,f,g){d.watchPosition(e,f,g)},clearWatch:function(e){d.clearWatch(e)},getPermission:function(g,e,f){d.getPermission(g,e,f)}}});var b=(function(){var i=false;var e=function(){if(!d()&&!i){i=true;var j=document.createElement("script");j.src=(document.location.protocol=="https:"?"https://":"http://")+"www.google.com/jsapi?callback=_google_loader_apiLoaded";j.type="text/javascript";document.getElementsByTagName("body")[0].appendChild(j)}};var c=[];var h=function(j){c.push(j)};var f=function(){if(d()){while(c.length>0){var j=c.pop();j()}}};window._google_loader_apiLoaded=function(){f()};var d=function(){return(window.google&&google.loader)};var g=function(j){if(d()){return true}h(j);e();return false};e();return{shim:true,type:"ClientLocation",lastPosition:null,getCurrentPosition:function(k,n,o){var m=this;if(!g(function(){m.getCurrentPosition(k,n,o)})){return}if(google.loader.ClientLocation){var l=google.loader.ClientLocation;var j={coords:{latitude:l.latitude,longitude:l.longitude,altitude:null,accuracy:43000,altitudeAccuracy:null,heading:null,speed:null},address:{city:l.address.city,country:l.address.country,country_code:l.address.country_code,region:l.address.region},timestamp:new Date()};k(j);this.lastPosition=j}else{if(n==="function"){n({code:3,message:"Using the Google ClientLocation API and it is not able to calculate a location."})}}},watchPosition:function(j,l,m){this.getCurrentPosition(j,l,m);var k=this;var n=setInterval(function(){k.getCurrentPosition(j,l,m)},10000);return n},clearWatch:function(j){clearInterval(j)},getPermission:function(l,j,k){return true}}});navigator.geolocation=(window.google&&google.gears)?a():b()})()};
++var SN={C:{I:{CounterBlackout:false,MaxLength:140,PatternUsername:/^[0-9a-zA-Z\-_.]*$/,HTTP20x30x:[200,201,202,203,204,205,206,300,301,302,303,304,305,306,307],NoticeFormMaster:null},S:{Disabled:"disabled",Warning:"warning",Error:"error",Success:"success",Processing:"processing",CommandResult:"command_result",FormNotice:"form_notice",NoticeDataGeo:"notice_data-geo",NoticeDataGeoCookie:"NoticeDataGeo",NoticeDataGeoSelected:"notice_data-geo_selected",StatusNetInstance:"StatusNetInstance"}},messages:{},msg:function(a){if(typeof SN.messages[a]=="undefined"){return"["+a+"]"}else{return SN.messages[a]}},U:{FormNoticeEnhancements:function(b){if(jQuery.data(b[0],"ElementData")===undefined){MaxLength=b.find(".count").text();if(typeof(MaxLength)=="undefined"){MaxLength=SN.C.I.MaxLength}jQuery.data(b[0],"ElementData",{MaxLength:MaxLength});SN.U.Counter(b);NDT=b.find(".notice_data-text:first");NDT.bind("keyup",function(c){SN.U.Counter(b)});var a=function(c){window.setTimeout(function(){SN.U.Counter(b)},50)};NDT.bind("cut",a).bind("paste",a)}else{b.find(".count").text(jQuery.data(b[0],"ElementData").MaxLength)}},Counter:function(d){SN.C.I.FormNoticeCurrent=d;var b=jQuery.data(d[0],"ElementData").MaxLength;if(b<=0){return}var c=b-SN.U.CharacterCount(d);var a=d.find(".count");if(c.toString()!=a.text()){if(!SN.C.I.CounterBlackout||c===0){if(a.text()!=String(c)){a.text(c)}if(c<0){d.addClass(SN.C.S.Warning)}else{d.removeClass(SN.C.S.Warning)}if(!SN.C.I.CounterBlackout){SN.C.I.CounterBlackout=true;SN.C.I.FormNoticeCurrent=d;window.setTimeout("SN.U.ClearCounterBlackout(SN.C.I.FormNoticeCurrent);",500)}}}},CharacterCount:function(a){return a.find(".notice_data-text:first").val().length},ClearCounterBlackout:function(a){SN.C.I.CounterBlackout=false;SN.U.Counter(a)},RewriteAjaxAction:function(a){if(document.location.protocol=="https:"&&a.substr(0,5)=="http:"){return a.replace(/^http:\/\/[^:\/]+/,"https://"+document.location.host)}else{return a}},FormXHR:function(a){$.ajax({type:"POST",dataType:"xml",url:SN.U.RewriteAjaxAction(a.attr("action")),data:a.serialize()+"&ajax=1",beforeSend:function(b){a.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled)},error:function(d,e,c){var b=null;if(d.responseXML){b=$("#error",d.responseXML).text()}alert(b||c||e);a.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).removeAttr(SN.C.S.Disabled)},success:function(b,c){if(typeof($("form",b)[0])!="undefined"){form_new=document._importNode($("form",b)[0],true);a.replaceWith(form_new)}else{if(typeof($("p",b)[0])!="undefined"){a.replaceWith(document._importNode($("p",b)[0],true))}else{alert("Unknown error.")}}}})},FormNoticeXHR:function(b){SN.C.I.NoticeDataGeo={};b.append('<input type="hidden" name="ajax" value="1"/>');b.attr("action",SN.U.RewriteAjaxAction(b.attr("action")));var c=function(d,e){b.append($('<p class="form_response"></p>').addClass(d).text(e))};var a=function(){b.find(".form_response").remove()};b.ajaxForm({dataType:"xml",timeout:"60000",beforeSend:function(d){if(b.find(".notice_data-text:first").val()==""){b.addClass(SN.C.S.Warning);return false}b.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled);SN.U.normalizeGeoData(b);return true},error:function(f,g,e){b.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).removeAttr(SN.C.S.Disabled,SN.C.S.Disabled);a();if(g=="timeout"){c("error","Sorry! We had trouble sending your notice. The servers are overloaded. Please try again, and contact the site administrator if this problem persists.")}else{var d=SN.U.GetResponseXML(f);if($("."+SN.C.S.Error,d).length>0){b.append(document._importNode($("."+SN.C.S.Error,d)[0],true))}else{if(parseInt(f.status)===0||jQuery.inArray(parseInt(f.status),SN.C.I.HTTP20x30x)>=0){b.resetForm().find(".attach-status").remove();SN.U.FormNoticeEnhancements(b)}else{c("error","(Sorry! We had trouble sending your notice ("+f.status+" "+f.statusText+"). Please report the problem to the site administrator if this happens again.")}}}},success:function(i,f){a();var o=$("#"+SN.C.S.Error,i);if(o.length>0){c("error",o.text())}else{if($("body")[0].id=="bookmarklet"){self.close()}var d=$("#"+SN.C.S.CommandResult,i);if(d.length>0){c("success",d.text())}else{var n=document._importNode($("li",i)[0],true);var j=$("#notices_primary .notices:first");var l=b.closest("li.notice-reply");if(l.length>0){var k=b.closest(".threaded-replies");var m=k.find(".notice-reply-placeholder");l.remove();var e=$(n).attr("id");if($("#"+e).length==0){$(n).insertBefore(m)}else{}m.show()}else{if(j.length>0&&SN.U.belongsOnTimeline(n)){if($("#"+n.id).length===0){var h=b.find("[name=inreplyto]").val();var g="#notices_primary #notice-"+h;if($("body")[0].id=="conversation"){if(h.length>0&&$(g+" .notices").length<1){$(g).append('<ul class="notices"></ul>')}$($(g+" .notices")[0]).append(n)}else{j.prepend(n)}$("#"+n.id).css({display:"none"}).fadeIn(2500);SN.U.NoticeWithAttachment($("#"+n.id));SN.U.switchInputFormTab("placeholder")}}else{c("success",$("title",i).text())}}}b.resetForm();b.find("[name=inreplyto]").val("");b.find(".attach-status").remove();SN.U.FormNoticeEnhancements(b)}},complete:function(d,e){b.removeClass(SN.C.S.Processing).find(".submit").removeAttr(SN.C.S.Disabled).removeClass(SN.C.S.Disabled);b.find("[name=lat]").val(SN.C.I.NoticeDataGeo.NLat);b.find("[name=lon]").val(SN.C.I.NoticeDataGeo.NLon);b.find("[name=location_ns]").val(SN.C.I.NoticeDataGeo.NLNS);b.find("[name=location_id]").val(SN.C.I.NoticeDataGeo.NLID);b.find("[name=notice_data-geo]").attr("checked",SN.C.I.NoticeDataGeo.NDG)}})},FormProfileSearchXHR:function(a){$.ajax({type:"POST",dataType:"xml",url:a.attr("action"),data:a.serialize()+"&ajax=1",beforeSend:function(b){a.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled)},error:function(c,d,b){alert(b||d)},success:function(d,f){var b=$("#profile_search_results");if(typeof($("ul",d)[0])!="undefined"){var c=document._importNode($("ul",d)[0],true);b.replaceWith(c)}else{var e=$("<li/>").append(document._importNode($("p",d)[0],true));b.html(e)}a.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,false)}})},FormPeopletagsXHR:function(a){$.ajax({type:"POST",dataType:"xml",url:a.attr("action"),data:a.serialize()+"&ajax=1",beforeSend:function(b){a.addClass(SN.C.S.Processing).find(".submit").addClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,SN.C.S.Disabled)},error:function(c,d,b){alert(b||d)},success:function(d,e){var c=a.parents(".entity_tags");if(typeof($(".entity_tags",d)[0])!="undefined"){var b=document._importNode($(".entity_tags",d)[0],true);$(b).find(".editable").append($('<button class="peopletags_edit_button"/>'));c.replaceWith(b)}else{c.find("p").remove();c.append(document._importNode($("p",d)[0],true));a.removeClass(SN.C.S.Processing).find(".submit").removeClass(SN.C.S.Disabled).attr(SN.C.S.Disabled,false)}}})},normalizeGeoData:function(a){SN.C.I.NoticeDataGeo.NLat=a.find("[name=lat]").val();SN.C.I.NoticeDataGeo.NLon=a.find("[name=lon]").val();SN.C.I.NoticeDataGeo.NLNS=a.find("[name=location_ns]").val();SN.C.I.NoticeDataGeo.NLID=a.find("[name=location_id]").val();SN.C.I.NoticeDataGeo.NDG=a.find("[name=notice_data-geo]").attr("checked");var b=$.cookie(SN.C.S.NoticeDataGeoCookie);if(b!==null&&b!="disabled"){b=JSON.parse(b);SN.C.I.NoticeDataGeo.NLat=a.find("[name=lat]").val(b.NLat).val();SN.C.I.NoticeDataGeo.NLon=a.find("[name=lon]").val(b.NLon).val();if(b.NLNS){SN.C.I.NoticeDataGeo.NLNS=a.find("[name=location_ns]").val(b.NLNS).val();SN.C.I.NoticeDataGeo.NLID=a.find("[name=location_id]").val(b.NLID).val()}else{a.find("[name=location_ns]").val("");a.find("[name=location_id]").val("")}}if(b=="disabled"){SN.C.I.NoticeDataGeo.NDG=a.find("[name=notice_data-geo]").attr("checked",false).attr("checked")}else{SN.C.I.NoticeDataGeo.NDG=a.find("[name=notice_data-geo]").attr("checked",true).attr("checked")}},GetResponseXML:function(b){try{return b.responseXML}catch(a){return(new DOMParser()).parseFromString(b.responseText,"text/xml")}},NoticeReply:function(){$("#content .notice_reply").live("click",function(c){c.preventDefault();var b=$(this).closest("li.notice");var a=($(".author .nickname",b).length>0)?$($(".author .nickname",b)[0]):$(".author .nickname.uid");SN.U.NoticeInlineReplyTrigger(b,"@"+a.text());return false})},NoticeReplyTo:function(a){},NoticeInlineReplyTrigger:function(i,j){var b=$($(".notice_id",i)[0]).text();var e=i;var f=i.closest(".notices");if(f.hasClass("threaded-replies")){e=f.closest(".notice")}else{f=$("ul.threaded-replies",i);if(f.length==0){f=$('<ul class="notices threaded-replies xoxo"></ul>');i.append(f)}}var k=$(".notice-reply-form",f);var d=function(){k.find("input[name=inreplyto]").val(b);var n=k.find("textarea");if(n.length==0){throw"No textarea"}var m="";if(j){m=j+" "}n.val(m+n.val().replace(RegExp(m,"i"),""));n.data("initialText",$.trim(j+""));n.focus();if(n[0].setSelectionRange){var l=n.val().length;n[0].setSelectionRange(l,l)}};if(k.length>0){d()}else{var h=f.find("li.notice-reply-placeholder").hide();var g=$("li.notice-reply",f);if(g.length==0){g=$('<li class="notice-reply"></li>');var c=function(l){var m=document._importNode(l,true);g.append(m);f.append(g);var n=k=$(m);SN.Init.NoticeFormSetup(n);d()};if(SN.C.I.NoticeFormMaster){c(SN.C.I.NoticeFormMaster)}else{var a=$("#form_notice").attr("action");$.get(a,{ajax:1},function(l,n,m){c($("form",l)[0])})}}}},NoticeInlineReplyPlaceholder:function(b){var a=b.find("ul.threaded-replies");var c=$('<li class="notice-reply-placeholder"><input class="placeholder"></li>');c.find("input").val(SN.msg("reply_placeholder"));a.append(c)},NoticeInlineReplySetup:function(){$("li.notice-reply-placeholder input").live("focus",function(){var a=$(this).closest("li.notice");SN.U.NoticeInlineReplyTrigger(a);return false});$("li.notice-reply-comments a").live("click",function(){var a=$(this).attr("href");var b=$(this).closest(".threaded-replies");$.get(a,{ajax:1},function(d,f,e){var c=$(".threaded-replies",d);if(c.length){b.replaceWith(document._importNode(c[0],true))}});return false})},NoticeRepeat:function(){$(".form_repeat").live("click",function(a){a.preventDefault();SN.U.NoticeRepeatConfirmation($(this));return false})},NoticeRepeatConfirmation:function(a){var c=a.find(".submit");var b=c.clone();b.addClass("submit_dialogbox").removeClass("submit");a.append(b);b.bind("click",function(){SN.U.FormXHR(a);return false});c.hide();a.addClass("dialogbox").append('<button class="close">&#215;</button>').closest(".notice-options").addClass("opaque");a.find("button.close").click(function(){$(this).remove();a.removeClass("dialogbox").closest(".notice-options").removeClass("opaque");a.find(".submit_dialogbox").remove();a.find(".submit").show();return false})},NoticeAttachments:function(){$(".notice a.attachment").each(function(){SN.U.NoticeWithAttachment($(this).closest(".notice"))})},NoticeWithAttachment:function(b){if(b.find(".attachment").length===0){return}var a=b.find(".attachment.more");if(a.length>0){$(a[0]).click(function(){var c=$(this);c.addClass(SN.C.S.Processing);$.get(c.attr("href")+"/ajax",null,function(d){c.parent(".entry-content").html($(d).find("#attachment_view .entry-content").html())});return false}).attr("title",SN.msg("showmore_tooltip"))}},NoticeDataAttach:function(b){var a=b.find("input[type=file]");a.change(function(f){b.find(".attach-status").remove();var d=$(this).val();if(!d){return false}var c=$('<div class="attach-status '+SN.C.S.Success+'"><code></code> <button class="close">&#215;</button></div>');c.find("code").text(d);c.find("button").click(function(){c.remove();a.val("");return false});b.append(c);if(typeof this.files=="object"){for(var e=0;e<this.files.length;e++){SN.U.PreviewAttach(b,this.files[e])}}})},maxFileSize:function(b){var a=$(b).find("input[name=MAX_FILE_SIZE]").attr("value");if(a){return parseInt(a)}else{return 0}},PreviewAttach:function(d,c){var e=c.type+" "+Math.round(c.size/1024)+"KB";var f=true;var h;if(typeof window.createObjectURL!="undefined"){h=function(i,j){j(window.createObjectURL(i))}}else{if(typeof window.FileReader!="undefined"){h=function(j,k){var i=new FileReader();i.onload=function(l){k(i.result)};i.readAsDataURL(j)}}else{f=false}}var a=["image/png","image/jpeg","image/gif","image/svg+xml"];if($.inArray(c.type,a)==-1){f=false}var g=8*1024*1024;if(c.size>g){f=false}if(f){h(c,function(j){var i=$("<img>").attr("title",e).attr("alt",e).attr("src",j).attr("style","height: 120px");d.find(".attach-status").append(i)})}else{var b=$("<div></div>").text(e);d.find(".attach-status").append(b)}},NoticeLocationAttach:function(a){var e=a.find("[name=lat]");var k=a.find("[name=lon]");var g=a.find("[name=location_ns]").val();var l=a.find("[name=location_id]").val();var b="";var d=a.find("[name=notice_data-geo]");var c=a.find("[name=notice_data-geo]");var j=a.find("label.notice_data-geo");function f(n){j.attr("title",jQuery.trim(j.text())).removeClass("checked");a.find("[name=lat]").val("");a.find("[name=lon]").val("");a.find("[name=location_ns]").val("");a.find("[name=location_id]").val("");a.find("[name=notice_data-geo]").attr("checked",false);$.cookie(SN.C.S.NoticeDataGeoCookie,"disabled",{path:"/"});if(n){a.find(".geo_status_wrapper").removeClass("success").addClass("error");a.find(".geo_status_wrapper .geo_status").text(n)}else{a.find(".geo_status_wrapper").remove()}}function m(n,o){SN.U.NoticeGeoStatus(a,"Looking up place name...");$.getJSON(n,o,function(p){var q,r;if(typeof(p.location_ns)!="undefined"){a.find("[name=location_ns]").val(p.location_ns);q=p.location_ns}if(typeof(p.location_id)!="undefined"){a.find("[name=location_id]").val(p.location_id);r=p.location_id}if(typeof(p.name)=="undefined"){NLN_text=o.lat+";"+o.lon}else{NLN_text=p.name}SN.U.NoticeGeoStatus(a,NLN_text,o.lat,o.lon,p.url);j.attr("title",NoticeDataGeo_text.ShareDisable+" ("+NLN_text+")");a.find("[name=lat]").val(o.lat);a.find("[name=lon]").val(o.lon);a.find("[name=location_ns]").val(q);a.find("[name=location_id]").val(r);a.find("[name=notice_data-geo]").attr("checked",true);var s={NLat:o.lat,NLon:o.lon,NLNS:q,NLID:r,NLN:NLN_text,NLNU:p.url,NDG:true};$.cookie(SN.C.S.NoticeDataGeoCookie,JSON.stringify(s),{path:"/"})})}if(c.length>0){if($.cookie(SN.C.S.NoticeDataGeoCookie)=="disabled"){c.attr("checked",false)}else{c.attr("checked",true)}var h=a.find(".notice_data-geo_wrap");var i=h.attr("data-api");j.attr("title",j.text());c.change(function(){if(c.attr("checked")===true||$.cookie(SN.C.S.NoticeDataGeoCookie)===null){j.attr("title",NoticeDataGeo_text.ShareDisable).addClass("checked");if($.cookie(SN.C.S.NoticeDataGeoCookie)===null||$.cookie(SN.C.S.NoticeDataGeoCookie)=="disabled"){if(navigator.geolocation){SN.U.NoticeGeoStatus(a,"Requesting location from browser...");navigator.geolocation.getCurrentPosition(function(p){a.find("[name=lat]").val(p.coords.latitude);a.find("[name=lon]").val(p.coords.longitude);var q={lat:p.coords.latitude,lon:p.coords.longitude,token:$("#token").val()};m(i,q)},function(p){switch(p.code){case p.PERMISSION_DENIED:f("Location permission denied.");break;case p.TIMEOUT:f("Location lookup timeout.");break}},{timeout:10000})}else{if(e.length>0&&k.length>0){var n={lat:e,lon:k,token:$("#token").val()};m(i,n)}else{f();c.remove();j.remove()}}}else{var o=JSON.parse($.cookie(SN.C.S.NoticeDataGeoCookie));a.find("[name=lat]").val(o.NLat);a.find("[name=lon]").val(o.NLon);a.find("[name=location_ns]").val(o.NLNS);a.find("[name=location_id]").val(o.NLID);a.find("[name=notice_data-geo]").attr("checked",o.NDG);SN.U.NoticeGeoStatus(a,o.NLN,o.NLat,o.NLon,o.NLNU);j.attr("title",NoticeDataGeo_text.ShareDisable+" ("+o.NLN+")").addClass("checked")}}else{f()}}).change()}},NoticeGeoStatus:function(e,a,f,g,c){var h=e.find(".geo_status_wrapper");if(h.length==0){h=$('<div class="'+SN.C.S.Success+' geo_status_wrapper"><button class="close" style="float:right">&#215;</button><div class="geo_status"></div></div>');h.find("button.close").click(function(){e.find("[name=notice_data-geo]").removeAttr("checked").change();return false});e.append(h)}var b;if(c){b=$("<a></a>").attr("href",c)}else{b=$("<span></span>")}b.text(a);if(f||g){var d=f+";"+g;b.attr("title",d);if(!a){b.text(d)}}h.find(".geo_status").empty().append(b)},NewDirectMessage:function(){NDM=$(".entity_send-a-message a");NDM.attr({href:NDM.attr("href")+"&ajax=1"});NDM.bind("click",function(){var a=$(".entity_send-a-message form");if(a.length===0){$(this).addClass(SN.C.S.Processing);$.get(NDM.attr("href"),null,function(b){$(".entity_send-a-message").append(document._importNode($("form",b)[0],true));a=$(".entity_send-a-message .form_notice");SN.U.FormNoticeXHR(a);SN.U.FormNoticeEnhancements(a);a.append('<button class="close">&#215;</button>');$(".entity_send-a-message button").click(function(){a.hide();return false});NDM.removeClass(SN.C.S.Processing)})}else{a.show();$(".entity_send-a-message textarea").focus()}return false})},GetFullYear:function(c,d,a){var b=new Date();b.setFullYear(c,d,a);return b},StatusNetInstance:{Set:function(b){var a=SN.U.StatusNetInstance.Get();if(a!==null){b=$.extend(a,b)}$.cookie(SN.C.S.StatusNetInstance,JSON.stringify(b),{path:"/",expires:SN.U.GetFullYear(2029,0,1)})},Get:function(){var a=$.cookie(SN.C.S.StatusNetInstance);if(a!==null){return JSON.parse(a)}return null},Delete:function(){$.cookie(SN.C.S.StatusNetInstance,null)}},belongsOnTimeline:function(b){var a=$("body").attr("id");if(a=="public"){return true}var c=$("#nav_profile a").attr("href");if(c){var d=$(b).find(".vcard.author a.url").attr("href");if(d==c){if(a=="all"||a=="showstream"){return true}}}return false},switchInputFormTab:function(a){$(".input_form_nav_tab.current").removeClass("current");if(a=="placeholder"){$("#input_form_nav_status").addClass("current")}else{$("#input_form_nav_"+a).addClass("current")}$(".input_form.current").removeClass("current");$("#input_form_"+a).addClass("current").find(".ajax-notice").each(function(){var b=$(this);SN.Init.NoticeFormSetup(b)}).find("textarea:first").focus()}},Init:{NoticeForm:function(){if($("body.user_in").length>0){$("#input_form_placeholder input.placeholder").focus(function(){SN.U.switchInputFormTab("status")});$("body").bind("click",function(g){var d=$("#content .input_forms div.current");if(d.length>0){if($("#content .input_forms").has(g.target).length==0){var a=d.find('textarea, input[type=text], input[type=""]');var c=false;a.each(function(){c=c||$(this).val()});if(!c){SN.U.switchInputFormTab("placeholder")}}}var b=$("li.notice-reply");if(b.length>0){var f=$(g.target);b.each(function(){var j=$(this);if(j.has(g.target).length==0){var h=j.find(".notice_data-text:first");var i=$.trim(h.val());if(i==""||i==h.data("initialText")){var e=j.closest("li.notice");j.remove();e.find("li.notice-reply-placeholder").show()}}})}})}},NoticeFormSetup:function(a){if(!a.data("NoticeFormSetup")){SN.U.NoticeLocationAttach(a);SN.U.FormNoticeXHR(a);SN.U.FormNoticeEnhancements(a);SN.U.NoticeDataAttach(a);a.data("NoticeFormSetup",true)}},Notices:function(){if($("body.user_in").length>0){var a=$(".form_notice:first");if(a.length>0){SN.C.I.NoticeFormMaster=document._importNode(a[0],true)}SN.U.NoticeRepeat();SN.U.NoticeReply();SN.U.NoticeInlineReplySetup()}SN.U.NoticeAttachments()},EntityActions:function(){if($("body.user_in").length>0){$(".form_user_subscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_unsubscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_group_join").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_group_leave").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_nudge").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_peopletag_subscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_peopletag_unsubscribe").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_add_peopletag").live("click",function(){SN.U.FormXHR($(this));return false});$(".form_user_remove_peopletag").live("click",function(){SN.U.FormXHR($(this));return false});SN.U.NewDirectMessage()}},ProfileSearch:function(){if($("body.user_in").length>0){$(".form_peopletag_edit_user_search input.submit").live("click",function(){SN.U.FormProfileSearchXHR($(this).parents("form"));return false})}},Login:function(){if(SN.U.StatusNetInstance.Get()!==null){var a=SN.U.StatusNetInstance.Get().Nickname;if(a!==null){$("#form_login #nickname").val(a)}}$("#form_login").bind("submit",function(){SN.U.StatusNetInstance.Set({Nickname:$("#form_login #nickname").val()});return true})},PeopletagAutocomplete:function(){$(".form_tag_user #tags").tagInput({tags:SN.C.PtagACData,tagSeparator:" ",animate:false,formatLine:function(d,g,c,f){var a="<b>"+g.tag.substring(0,c.length)+"</b>"+g.tag.substring(c.length);var b=$("<div/>").addClass("mode-"+g.mode);b.append($("<div class='tagInputLineTag'>"+a+" <em class='privacy_mode'>"+g.mode+"</em></div>"));if(g.freq){b.append("<div class='tagInputLineFreq'>"+g.freq+"</div>")}return b}})},PeopleTags:function(){$(".user_profile_tags .editable").append($('<button class="peopletags_edit_button"/>'));$(".peopletags_edit_button").live("click",function(){var a=$(this).parents("dd").eq(0).find("form");if(typeof SN.C.PtagACData==="undefined"){$.getJSON(_peopletagAC+"?token="+$("#token").val(),function(b){SN.C.PtagACData=b;_loadTagInput(SN.Init.PeopletagAutocomplete)})}else{_loadTagInput(SN.Init.PeopletagAutocomplete)}$(this).parents("ul").eq(0).fadeOut(200,function(){a.fadeIn(200).find("input#tags")})});$(".user_profile_tags form .submit").live("click",function(){SN.U.FormPeopletagsXHR($(this).parents("form"));return false})},AjaxForms:function(){$("form.ajax").live("submit",function(){SN.U.FormXHR($(this));return false})},UploadForms:function(){$("input[type=file]").change(function(d){if(typeof this.files=="object"&&this.files.length>0){var c=0;for(var b=0;b<this.files.length;b++){c+=this.files[b].size}var a=SN.U.maxFileSize($(this.form));if(a>0&&c>a){var e="File too large: maximum upload size is %d bytes.";alert(e.replace("%d",a));$(this).val("");d.preventDefault();return false}}})}}};$(document).ready(function(){SN.Init.AjaxForms();SN.Init.UploadForms();if($("."+SN.C.S.FormNotice).length>0){SN.Init.NoticeForm()}if($("#content .notices").length>0){SN.Init.Notices()}if($("#content .entity_actions").length>0){SN.Init.EntityActions()}if($("#form_login").length>0){SN.Init.Login()}if($("#profile_search_results").length>0){SN.Init.ProfileSearch()}if($(".user_profile_tags .editable").length>0){SN.Init.PeopleTags()}});if(!document.ELEMENT_NODE){document.ELEMENT_NODE=1;document.ATTRIBUTE_NODE=2;document.TEXT_NODE=3;document.CDATA_SECTION_NODE=4;document.ENTITY_REFERENCE_NODE=5;document.ENTITY_NODE=6;document.PROCESSING_INSTRUCTION_NODE=7;document.COMMENT_NODE=8;document.DOCUMENT_NODE=9;document.DOCUMENT_TYPE_NODE=10;document.DOCUMENT_FRAGMENT_NODE=11;document.NOTATION_NODE=12}document._importNode=function(e,a){switch(e.nodeType){case document.ELEMENT_NODE:var d=document.createElement(e.nodeName);if(e.attributes&&e.attributes.length>0){for(var c=0,b=e.attributes.length;c<b;){if(e.attributes[c].nodeName=="class"){d.className=e.getAttribute(e.attributes[c++].nodeName)}else{d.setAttribute(e.attributes[c].nodeName,e.getAttribute(e.attributes[c++].nodeName))}}}if(a&&e.childNodes&&e.childNodes.length>0){for(var c=0,b=e.childNodes.length;c<b;){d.appendChild(document._importNode(e.childNodes[c++],a))}}return d;break;case document.TEXT_NODE:case document.CDATA_SECTION_NODE:case document.COMMENT_NODE:return document.createTextNode(e.nodeValue);break}};if(typeof navigator.geolocation=="undefined"||navigator.geolocation.shim){(function(){(function(){if(window.google&&google.gears){return}var c=null;if(typeof GearsFactory!="undefined"){c=new GearsFactory()}else{try{c=new ActiveXObject("Gears.Factory");if(c.getBuildInfo().indexOf("ie_mobile")!=-1){c.privateSetGlobalObject(this)}}catch(d){if((typeof navigator.mimeTypes!="undefined")&&navigator.mimeTypes["application/x-googlegears"]){c=document.createElement("object");c.style.display="none";c.width=0;c.height=0;c.type="application/x-googlegears";document.documentElement.appendChild(c)}}}if(!c){return}if(!window.google){google={}}if(!google.gears){google.gears={factory:c}}})();var a=(function(){var d=google.gears.factory.create("beta.geolocation");var c=function(f,e){return function(g){f(g);e.lastPosition=g}};return{shim:true,type:"Gears",lastPosition:null,getCurrentPosition:function(e,g,h){var f=this;var i=c(e,f);d.getCurrentPosition(i,g,h)},watchPosition:function(e,f,g){d.watchPosition(e,f,g)},clearWatch:function(e){d.clearWatch(e)},getPermission:function(g,e,f){d.getPermission(g,e,f)}}});var b=(function(){var i=false;var e=function(){if(!d()&&!i){i=true;var j=document.createElement("script");j.src=(document.location.protocol=="https:"?"https://":"http://")+"www.google.com/jsapi?callback=_google_loader_apiLoaded";j.type="text/javascript";document.getElementsByTagName("body")[0].appendChild(j)}};var c=[];var h=function(j){c.push(j)};var f=function(){if(d()){while(c.length>0){var j=c.pop();j()}}};window._google_loader_apiLoaded=function(){f()};var d=function(){return(window.google&&google.loader)};var g=function(j){if(d()){return true}h(j);e();return false};e();return{shim:true,type:"ClientLocation",lastPosition:null,getCurrentPosition:function(k,n,o){var m=this;if(!g(function(){m.getCurrentPosition(k,n,o)})){return}if(google.loader.ClientLocation){var l=google.loader.ClientLocation;var j={coords:{latitude:l.latitude,longitude:l.longitude,altitude:null,accuracy:43000,altitudeAccuracy:null,heading:null,speed:null},address:{city:l.address.city,country:l.address.country,country_code:l.address.country_code,region:l.address.region},timestamp:new Date()};k(j);this.lastPosition=j}else{if(n==="function"){n({code:3,message:"Using the Google ClientLocation API and it is not able to calculate a location."})}}},watchPosition:function(j,l,m){this.getCurrentPosition(j,l,m);var k=this;var n=setInterval(function(){k.getCurrentPosition(j,l,m)},10000);return n},clearWatch:function(j){clearInterval(j)},getPermission:function(l,j,k){return true}}});navigator.geolocation=(window.google&&google.gears)?a():b()})()};
index 0000000000000000000000000000000000000000,a8bdb4715bf5794e8025ac0c699d3b1434dab15e..61b65435abff40a7f49f1e1ab3e530456eee7147
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,290 +1,290 @@@
 -}
+ <?php
+ /**
+  * StatusNet - the distributed open-source microblogging tool
+  * Copyright (C) 2011, StatusNet, Inc.
+  *
+  * Profile block to show for an account
+  *
+  * PHP version 5
+  *
+  * This program is free software: you can redistribute it and/or modify
+  * it under the terms of the GNU Affero General Public License as published by
+  * the Free Software Foundation, either version 3 of the License, or
+  * (at your option) any later version.
+  *
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  * GNU Affero General Public License for more details.
+  *
+  * You should have received a copy of the GNU Affero General Public License
+  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  *
+  * @category  Widget
+  * @package   StatusNet
+  * @author    Evan Prodromou <evan@status.net>
+  * @copyright 2011 StatusNet, Inc.
+  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+  * @link      http://status.net/
+  */
+ if (!defined('STATUSNET')) {
+     // This check helps protect against security problems;
+     // your code file can't be executed directly from the web.
+     exit(1);
+ }
+ /**
+  * Profile block to show for an account
+  *
+  * @category  Widget
+  * @package   StatusNet
+  * @author    Evan Prodromou <evan@status.net>
+  * @copyright 2011 StatusNet, Inc.
+  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+  * @link      http://status.net/
+  */
+ class AccountProfileBlock extends ProfileBlock
+ {
+     protected $profile = null;
+     protected $user    = null;
+     function __construct($out, $profile)
+     {
+         parent::__construct($out);
+         $this->profile = $profile;
+         $this->user    = User::staticGet('id', $profile->id);
+     }
+     function avatar()
+     {
+         $avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
+         if (empty($avatar)) {
+             $avatar = $this->profile->getAvatar(73);
+         }
+         return (!empty($avatar)) ?
+             $avatar->displayUrl() :
+             Avatar::defaultImage(AVATAR_PROFILE_SIZE);
+     }
+     function name()
+     {
+         return $this->profile->getBestName();
+     }
+     function url()
+     {
+         return $this->profile->profileurl;
+     }
+     function location()
+     {
+         return $this->profile->location;
+     }
+     function homepage()
+     {
+         return $this->profile->homepage;
+     }
+     function description()
+     {
+         return $this->profile->bio;
+     }
+     function showActions()
+     {
+         if (Event::handle('StartProfilePageActionsSection', array($this->out, $this->profile))) {
+             if ($this->profile->hasRole(Profile_role::DELETED)) {
+                 $this->out->elementStart('div', 'entity_actions');
+                 // TRANS: H2 for user actions in a profile.
+                 $this->out->element('h2', null, _('User actions'));
+                 $this->out->elementStart('ul');
+                 $this->out->elementStart('p', array('class' => 'profile_deleted'));
+                 // TRANS: Text shown in user profile of not yet compeltely deleted users.
+                 $this->out->text(_('User deletion in progress...'));
+                 $this->out->elementEnd('p');
+                 $this->out->elementEnd('ul');
+                 $this->out->elementEnd('div');
+                 return;
+             }
+             $cur = common_current_user();
+             $this->out->elementStart('div', 'entity_actions');
+             // TRANS: H2 for entity actions in a profile.
+             $this->out->element('h2', null, _('User actions'));
+             $this->out->elementStart('ul');
+             if (Event::handle('StartProfilePageActionsElements', array($this->out, $this->profile))) {
+                 if (empty($cur)) { // not logged in
+                     if (Event::handle('StartProfileRemoteSubscribe', array($this->out, $this->profile))) {
+                         $this->out->elementStart('li', 'entity_subscribe');
+                         $this->showRemoteSubscribeLink();
+                         $this->out->elementEnd('li');
+                         Event::handle('EndProfileRemoteSubscribe', array($this->out, $this->profile));
+                     }
+                 } else {
+                     if ($cur->id == $this->profile->id) { // your own page
+                         $this->out->elementStart('li', 'entity_edit');
+                         $this->out->element('a', array('href' => common_local_url('profilesettings'),
+                                                   // TRANS: Link title for link on user profile.
+                                                   'title' => _('Edit profile settings')),
+                                        // TRANS: Link text for link on user profile.
+                                        _('Edit'));
+                         $this->out->elementEnd('li');
+                     } else { // someone else's page
+                         // subscribe/unsubscribe button
+                         $this->out->elementStart('li', 'entity_subscribe');
+                         if ($cur->isSubscribed($this->profile)) {
+                             $usf = new UnsubscribeForm($this->out, $this->profile);
+                             $usf->show();
+                         } else {
+                             $sf = new SubscribeForm($this->out, $this->profile);
+                             $sf->show();
+                         }
+                         $this->out->elementEnd('li');
+                         if ($cur->mutuallySubscribed($this->profile)) {
+                             // message
+                             $this->out->elementStart('li', 'entity_send-a-message');
+                             $this->out->element('a', array('href' => common_local_url('newmessage', array('to' => $this->user->id)),
+                                                       // TRANS: Link title for link on user profile.
+                                                       'title' => _('Send a direct message to this user')),
+                                            // TRANS: Link text for link on user profile.
+                                            _('Message'));
+                             $this->out->elementEnd('li');
+                             // nudge
+                             if ($this->user && $this->user->email && $this->user->emailnotifynudge) {
+                                 $this->out->elementStart('li', 'entity_nudge');
+                                 $nf = new NudgeForm($this->out, $this->user);
+                                 $nf->show();
+                                 $this->out->elementEnd('li');
+                             }
+                         }
+                         // return-to args, so we don't have to keep re-writing them
+                         list($action, $r2args) = $this->out->returnToArgs();
+                         // push the action into the list
+                         $r2args['action'] = $action;
+                         // block/unblock
+                         $blocked = $cur->hasBlocked($this->profile);
+                         $this->out->elementStart('li', 'entity_block');
+                         if ($blocked) {
+                             $ubf = new UnblockForm($this->out, $this->profile, $r2args);
+                             $ubf->show();
+                         } else {
+                             $bf = new BlockForm($this->out, $this->profile, $r2args);
+                             $bf->show();
+                         }
+                         $this->out->elementEnd('li');
+                         // Some actions won't be applicable to non-local users.
+                         $isLocal = !empty($this->user);
+                         if ($cur->hasRight(Right::SANDBOXUSER) ||
+                             $cur->hasRight(Right::SILENCEUSER) ||
+                             $cur->hasRight(Right::DELETEUSER)) {
+                             $this->out->elementStart('li', 'entity_moderation');
+                             // TRANS: Label text on user profile to select a user role.
+                             $this->out->element('p', null, _('Moderate'));
+                             $this->out->elementStart('ul');
+                             if ($cur->hasRight(Right::SANDBOXUSER)) {
+                                 $this->out->elementStart('li', 'entity_sandbox');
+                                 if ($this->profile->isSandboxed()) {
+                                     $usf = new UnSandboxForm($this->out, $this->profile, $r2args);
+                                     $usf->show();
+                                 } else {
+                                     $sf = new SandboxForm($this->out, $this->profile, $r2args);
+                                     $sf->show();
+                                 }
+                                 $this->out->elementEnd('li');
+                             }
+                             if ($cur->hasRight(Right::SILENCEUSER)) {
+                                 $this->out->elementStart('li', 'entity_silence');
+                                 if ($this->profile->isSilenced()) {
+                                     $usf = new UnSilenceForm($this->out, $this->profile, $r2args);
+                                     $usf->show();
+                                 } else {
+                                     $sf = new SilenceForm($this->out, $this->profile, $r2args);
+                                     $sf->show();
+                                 }
+                                 $this->out->elementEnd('li');
+                             }
+                             if ($isLocal && $cur->hasRight(Right::DELETEUSER)) {
+                                 $this->out->elementStart('li', 'entity_delete');
+                                 $df = new DeleteUserForm($this->out, $this->profile, $r2args);
+                                 $df->show();
+                                 $this->out->elementEnd('li');
+                             }
+                             $this->out->elementEnd('ul');
+                             $this->out->elementEnd('li');
+                         }
+                         if ($isLocal && $cur->hasRight(Right::GRANTROLE)) {
+                             $this->out->elementStart('li', 'entity_role');
+                             // TRANS: Label text on user profile to select a user role.
+                             $this->out->element('p', null, _('User role'));
+                             $this->out->elementStart('ul');
+                             // TRANS: Role that can be set for a user profile.
+                             $this->roleButton('administrator', _m('role', 'Administrator'));
+                             // TRANS: Role that can be set for a user profile.
+                             $this->roleButton('moderator', _m('role', 'Moderator'));
+                             $this->out->elementEnd('ul');
+                             $this->out->elementEnd('li');
+                         }
+                     }
+                 }
+                 Event::handle('EndProfilePageActionsElements', array($this->out, $this->profile));
+             }
+             $this->out->elementEnd('ul');
+             $this->out->elementEnd('div');
+             Event::handle('EndProfilePageActionsSection', array($this->out, $this->profile));
+         }
+     }
+     function roleButton($role, $label)
+     {
+         list($action, $r2args) = $this->out->returnToArgs();
+         $r2args['action'] = $action;
+         $this->out->elementStart('li', "entity_role_$role");
+         if ($this->profile->hasRole($role)) {
+             $rf = new RevokeRoleForm($role, $label, $this->out, $this->profile, $r2args);
+             $rf->show();
+         } else {
+             $rf = new GrantRoleForm($role, $label, $this->out, $this->profile, $r2args);
+             $rf->show();
+         }
+         $this->out->elementEnd('li');
+     }
+     function showRemoteSubscribeLink()
+     {
+         $url = common_local_url('remotesubscribe',
+                                 array('nickname' => $this->profile->nickname));
+         $this->out->element('a', array('href' => $url,
+                                   'class' => 'entity_remote_subscribe'),
+                        // TRANS: Link text for link that will subscribe to a remote profile.
+                        _('Subscribe'));
+     }
++}
diff --cc lib/action.php
index 80b31762538d34063fdf897a592411d5a174c005,654ec7aa43e533b6c94ca8ba8bfc580935c9357a..2089debc4906e1259ddeea7ca5b1e811192a7bb6
@@@ -286,13 -302,21 +302,22 @@@ class Action extends HTMLOutputter // l
      {
          if (Event::handle('StartShowScripts', array($this))) {
              if (Event::handle('StartShowJQueryScripts', array($this))) {
-                 $this->script('jquery.min.js');
-                 $this->script('jquery.form.min.js');
-                 $this->script('jquery.cookie.min.js');
-                 $this->inlineScript('if (typeof window.JSON !== "object") { $.getScript("'.common_path('js/json2.min.js').'"); }');
-                 $this->script('jquery.joverlay.min.js');
-                 $this->inlineScript('function _loadTagInput(init) { $.getScript("'.common_path('js/jquery.timers.js'). '"); $.getScript("'.common_path('js/jquery.tagInput.js').'", init); } var _peopletagAC = "' . common_local_url('peopletagautocomplete') . '";');
+                 if (common_config('site', 'minify')) {
+                     $this->script('jquery.min.js');
+                     $this->script('jquery.form.min.js');
+                     $this->script('jquery-ui.min.js');
+                     $this->script('jquery.cookie.min.js');
+                     $this->inlineScript('if (typeof window.JSON !== "object") { $.getScript("'.common_path('js/json2.min.js').'"); }');
+                     $this->script('jquery.joverlay.min.js');
+                 } else {
+                     $this->script('jquery.js');
+                     $this->script('jquery.form.js');
+                     $this->script('jquery-ui.min.js');
+                     $this->script('jquery.cookie.js');
+                     $this->inlineScript('if (typeof window.JSON !== "object") { $.getScript("'.common_path('js/json2.js').'"); }');
+                     $this->script('jquery.joverlay.js');
+                 }
 +
                  Event::handle('EndShowJQueryScripts', array($this));
              }
              if (Event::handle('StartShowStatusNetScripts', array($this)) &&
                      $this->script('util.js');
                      $this->script('xbImportNode.js');
                      $this->script('geometa.js');
++
                  }
++                $this->inlineScript('function _loadTagInput(init) { $.getScript("'.common_path('js/jquery.timers.js') .
++                    '"); $.getScript("'.common_path('js/jquery.tagInput.js').'", init); } var _peopletagAC = "' .
++
++                    common_local_url('peopletagautocomplete') . '";');
                  $this->showScriptMessages();
                  // Frame-busting code to avoid clickjacking attacks.
                  $this->inlineScript('if (window.top !== window.self) { window.top.location.href = window.self.location.href; }');
index 7771455443d217f53a28511de82dce7081664121,241f99564f214287cfd2bae9480054be916a334b..a47928e871b0f2d7af6f651027bf207ddf4e0e0c
@@@ -621,28 -584,44 +606,50 @@@ class ActivityObjec
                      null
                  );
              }
-         }
  
-         if(!empty($this->owner)) {
-             $owner = $this->owner->asActivityNoun(self::AUTHOR);
-             $xo->raw($owner);
-         }
++            if(!empty($this->owner)) {
++                $owner = $this->owner->asActivityNoun(self::AUTHOR);
++                $xo->raw($owner);
++            }
 +
-         if (!empty($this->geopoint)) {
-             $xo->element(
-                 'georss:point',
-                 null,
-                 $this->geopoint
-             );
-         }
+             if ($this->type == ActivityObject::PERSON
+                 || $this->type == ActivityObject::GROUP) {
+                 foreach ($this->avatarLinks as $avatar) {
+                     $xo->element(
+                         'link', array(
+                             'rel'  => 'avatar',
+                             'type'         => $avatar->type,
+                             'media:width'  => $avatar->width,
+                             'media:height' => $avatar->height,
+                             'href' => $avatar->url
+                         ),
+                         null
+                     );
+                 }
+             }
  
-         if (!empty($this->poco)) {
-             $this->poco->outputTo($xo);
-         }
 +
-         foreach ($this->extra as $el) {
-             list($extraTag, $attrs, $content) = $el;
-             $xo->element($extraTag, $attrs, $content);
+             if (!empty($this->geopoint)) {
+                 $xo->element(
+                     'georss:point',
+                     null,
+                     $this->geopoint
+                 );
+             }
+             if (!empty($this->poco)) {
+                 $this->poco->outputTo($xo);
+             }
+             // @fixme there's no way here to make a tree; elements can only contain plaintext
+             // @fixme these may collide with JSON extensions
+             foreach ($this->extra as $el) {
+                 list($extraTag, $attrs, $content) = $el;
+                 $xo->element($extraTag, $attrs, $content);
+             }
+             Event::handle('EndActivityObjectOutputAtom', array($this, $xo));
          }
  
                if (!empty($tag)) {
diff --cc lib/command.php
index 750b1c88a26808f688474d4490930dafd8049ce7,03baa8212d998a569b1125be893a4b2030d4d771..39865234b6611d1cd79bb38409d13363cdc25c39
@@@ -1009,47 -911,88 +1009,92 @@@ class HelpCommand extends Comman
  {
      function handle($channel)
      {
-         $channel->output($this->user,
-                          // TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-                          _("Commands:\n".
-                            "on - turn on notifications\n".
-                            "off - turn off notifications\n".
-                            "help - show this help\n".
-                            "follow <nickname> - subscribe to user\n".
-                            "groups - lists the groups you have joined\n".
-                            "tag <nickname> <tags> - tag a user\n".
-                            "untag <nickname> <tags> - untag a user\n".
-                            "subscriptions - list the people you follow\n".
-                            "subscribers - list the people that follow you\n".
-                            "leave <nickname> - unsubscribe from user\n".
-                            "d <nickname> <text> - direct message to user\n".
-                            "get <nickname> - get last notice from user\n".
-                            "whois <nickname> - get profile info on user\n".
-                            "lose <nickname> - force user to stop following you\n".
-                            "fav <nickname> - add user's last notice as a 'fave'\n".
-                            "fav #<notice_id> - add notice with the given id as a 'fave'\n".
-                            "repeat #<notice_id> - repeat a notice with a given id\n".
-                            "repeat <nickname> - repeat the last notice from user\n".
-                            "reply #<notice_id> - reply to notice with a given id\n".
-                            "reply <nickname> - reply to the last notice from user\n".
-                            "join <group> - join group\n".
-                            "login - Get a link to login to the web interface\n".
-                            "drop <group> - leave group\n".
-                            "stats - get your stats\n".
-                            "stop - same as 'off'\n".
-                            "quit - same as 'off'\n".
-                            "sub <nickname> - same as 'follow'\n".
-                            "unsub <nickname> - same as 'leave'\n".
-                            "last <nickname> - same as 'get'\n".
-                            "on <nickname> - not yet implemented.\n".
-                            "off <nickname> - not yet implemented.\n".
-                            "nudge <nickname> - remind a user to update.\n".
-                            "invite <phone number> - not yet implemented.\n".
-                            "track <word> - not yet implemented.\n".
-                            "untrack <word> - not yet implemented.\n".
-                            "track off - not yet implemented.\n".
-                            "untrack all - not yet implemented.\n".
-                            "tracks - not yet implemented.\n".
-                            "tracking - not yet implemented.\n"));
+         // TRANS: Header line of help text for commands.
+         $out = array(_m('COMMANDHELP', "Commands:"));
+         $commands = array(// TRANS: Help message for IM/SMS command "on"
+                           "on" => _m('COMMANDHELP', "turn on notifications"),
+                           // TRANS: Help message for IM/SMS command "off"
+                           "off" => _m('COMMANDHELP', "turn off notifications"),
+                           // TRANS: Help message for IM/SMS command "help"
+                           "help" => _m('COMMANDHELP', "show this help"),
+                           // TRANS: Help message for IM/SMS command "follow <nickname>"
+                           "follow <nickname>" => _m('COMMANDHELP', "subscribe to user"),
+                           // TRANS: Help message for IM/SMS command "groups"
+                           "groups" => _m('COMMANDHELP', "lists the groups you have joined"),
++                          // TRANS: Help message for IM/SMS command "tag"
++                          "tag <nickname> <tags>" => _m('COMMANDHELP',"tag a user"),
++                          // TRANS: Help message for IM/SMS command "untag"
++                          "untag <nickname> <tags>" => _m('COMMANDHELP',"untag a user"),
+                           // TRANS: Help message for IM/SMS command "subscriptions"
+                           "subscriptions" => _m('COMMANDHELP', "list the people you follow"),
+                           // TRANS: Help message for IM/SMS command "subscribers"
+                           "subscribers" => _m('COMMANDHELP', "list the people that follow you"),
+                           // TRANS: Help message for IM/SMS command "leave <nickname>"
+                           "leave <nickname>" => _m('COMMANDHELP', "unsubscribe from user"),
+                           // TRANS: Help message for IM/SMS command "d <nickname> <text>"
+                           "d <nickname> <text>" => _m('COMMANDHELP', "direct message to user"),
+                           // TRANS: Help message for IM/SMS command "get <nickname>"
+                           "get <nickname>" => _m('COMMANDHELP', "get last notice from user"),
+                           // TRANS: Help message for IM/SMS command "whois <nickname>"
+                           "whois <nickname>" => _m('COMMANDHELP', "get profile info on user"),
+                           // TRANS: Help message for IM/SMS command "lose <nickname>"
+                           "lose <nickname>" => _m('COMMANDHELP', "force user to stop following you"),
+                           // TRANS: Help message for IM/SMS command "fav <nickname>"
+                           "fav <nickname>" => _m('COMMANDHELP', "add user's last notice as a 'fave'"),
+                           // TRANS: Help message for IM/SMS command "fav #<notice_id>"
+                           "fav #<notice_id>" => _m('COMMANDHELP', "add notice with the given id as a 'fave'"),
+                           // TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+                           "repeat #<notice_id>" => _m('COMMANDHELP', "repeat a notice with a given id"),
+                           // TRANS: Help message for IM/SMS command "repeat <nickname>"
+                           "repeat <nickname>" => _m('COMMANDHELP', "repeat the last notice from user"),
+                           // TRANS: Help message for IM/SMS command "reply #<notice_id>"
+                           "reply #<notice_id>" => _m('COMMANDHELP', "reply to notice with a given id"),
+                           // TRANS: Help message for IM/SMS command "reply <nickname>"
+                           "reply <nickname>" => _m('COMMANDHELP', "reply to the last notice from user"),
+                           // TRANS: Help message for IM/SMS command "join <group>"
+                           "join <group>" => _m('COMMANDHELP', "join group"),
+                           // TRANS: Help message for IM/SMS command "login"
+                           "login" => _m('COMMANDHELP', "Get a link to login to the web interface"),
+                           // TRANS: Help message for IM/SMS command "drop <group>"
+                           "drop <group>" => _m('COMMANDHELP', "leave group"),
+                           // TRANS: Help message for IM/SMS command "stats"
+                           "stats" => _m('COMMANDHELP', "get your stats"),
+                           // TRANS: Help message for IM/SMS command "stop"
+                           "stop" => _m('COMMANDHELP', "same as 'off'"),
+                           // TRANS: Help message for IM/SMS command "quit"
+                           "quit" => _m('COMMANDHELP', "same as 'off'"),
+                           // TRANS: Help message for IM/SMS command "sub <nickname>"
+                           "sub <nickname>" => _m('COMMANDHELP', "same as 'follow'"),
+                           // TRANS: Help message for IM/SMS command "unsub <nickname>"
+                           "unsub <nickname>" => _m('COMMANDHELP', "same as 'leave'"),
+                           // TRANS: Help message for IM/SMS command "last <nickname>"
+                           "last <nickname>" => _m('COMMANDHELP', "same as 'get'"),
+                           // TRANS: Help message for IM/SMS command "on <nickname>"
+                           "on <nickname>" => _m('COMMANDHELP', "not yet implemented."),
+                           // TRANS: Help message for IM/SMS command "off <nickname>"
+                           "off <nickname>" => _m('COMMANDHELP', "not yet implemented."),
+                           // TRANS: Help message for IM/SMS command "nudge <nickname>"
+                           "nudge <nickname>" => _m('COMMANDHELP', "remind a user to update."),
+                           // TRANS: Help message for IM/SMS command "invite <phone number>"
+                           "invite <phone number>" => _m('COMMANDHELP', "not yet implemented."),
+                           // TRANS: Help message for IM/SMS command "track <word>"
+                           "track <word>" => _m('COMMANDHELP', "not yet implemented."),
+                           // TRANS: Help message for IM/SMS command "untrack <word>"
+                           "untrack <word>" => _m('COMMANDHELP', "not yet implemented."),
+                           // TRANS: Help message for IM/SMS command "track off"
+                           "track off" => _m('COMMANDHELP', "not yet implemented."),
+                           // TRANS: Help message for IM/SMS command "untrack all"
+                           "untrack all" => _m('COMMANDHELP', "not yet implemented."),
+                           // TRANS: Help message for IM/SMS command "tracks"
+                           "tracks" => _m('COMMANDHELP', "not yet implemented."),
+                           // TRANS: Help message for IM/SMS command "tracking"
+                           "tracking" => _m('COMMANDHELP', "not yet implemented."));
+         // Give plugins a chance to add or override...
+         Event::handle('HelpCommandMessages', array($this, &$commands));
+         foreach ($commands as $command => $help) {
+             $out[] = "$command - $help";
+         }
+         $channel->output($this->user, implode("\n", $out));
      }
  }
Simple merge
diff --cc lib/default.php
Simple merge
Simple merge
index ccd4ab506fcc4b992dd7af31ab749e410180896b,2e15ca5f6a02d3c9eec40802f97dd6759d8ac435..28bf8c529fd1091df9f019605febef408f957a4b
@@@ -108,13 -89,7 +89,13 @@@ class PersonalGroupNav extends Men
                                                                           $nickname)),
                                   _('Favorites'),
                                   sprintf(_('%s\'s favorite notices'), ($user_profile) ? $name : _('User')),
-                                  $action == 'showfavorites', 'nav_timeline_favorites');
+                                  $mine && $action =='showfavorites', 'nav_timeline_favorites');
 +            $this->out->menuItem(common_local_url('peopletagsbyuser', array('nickname' =>
 +                                                                  $nickname)),
 +                             _('People tags'),
-                              sprintf(_('People tags by %s'), ($user_profile) ? $user_profile->getBestName() : _('User')),
++                             sprintf(_('People tags by %s'), ($user_profile) ? $name : _('User')),
 +                             in_array($action, array('peopletagsbyuser', 'peopletagsforuser')),
 +                             'nav_timeline_peopletags');
  
              $cur = common_current_user();
  
Simple merge
diff --cc lib/router.php
Simple merge
Simple merge
diff --cc lib/util.php
Simple merge
index 666683affc4d8a8389e6e212115d8b2b46f2a181,738481149c89ee6636408780011ab14aecf49c1a..77b64dbb1d3fc3c6c777a22251f1699a5e8831d5
@@@ -227,29 -209,26 +227,32 @@@ class OStatusPlugin extends Plugi
       * Add in an OStatus subscribe button
       */
      function onStartProfileRemoteSubscribe($output, $profile)
-     function onStartGroupSubscribe($output, $group)
 +    {
 +        $this->onStartProfileListItemActionElements($output, $profile);
 +        return false;
 +    }
 +
++    function onStartGroupSubscribe($widget, $group)
      {
          $cur = common_current_user();
  
          if (empty($cur)) {
--            // Add an OStatus subscribe
+             $output->elementStart('li', 'entity_subscribe');
++            $profile = $peopletag->getTagger();
              $url = common_local_url('ostatusinit',
 -                                    array('nickname' => $profile->nickname));
 -            $output->element('a', array('href' => $url,
 +                                    array('group' => $group->nickname));
-             $output->element('a', array('href' => $url,
++            $widget->out->element('a', array('href' => $url,
                                          'class' => 'entity_remote_subscribe'),
-                                 _m('Join'));
 -                                // TRANS: Link description for link to subscribe to a remote user.
+                                 _m('Subscribe'));
  
+             $output->elementEnd('li');
++            return false;
          }
  
 -        return false;
 +        return true;
      }
  
 -    function onStartGroupSubscribe($widget, $group)
 +    function onStartSubscribePeopletagForm($output, $peopletag)
      {
          $cur = common_current_user();
  
Simple merge
Simple merge