diff --git a/actions/licenseadminpanel.php b/actions/licenseadminpanel.php
index 4adeb5c3c6..fda7cd4359 100644
--- a/actions/licenseadminpanel.php
+++ b/actions/licenseadminpanel.php
@@ -42,7 +42,6 @@ if (!defined('STATUSNET')) {
*/
class LicenseadminpanelAction extends AdminPanelAction
{
-
/**
* Returns the page title
*
@@ -62,6 +61,7 @@ class LicenseadminpanelAction extends AdminPanelAction
*/
function getInstructions()
{
+ // TRANS: Form instructions for the site license admin panel.
return _('License for this StatusNet site');
}
@@ -131,7 +131,8 @@ class LicenseadminpanelAction extends AdminPanelAction
$types = array('private', 'allrightsreserved', 'cc');
if (!in_array($values['license']['type'], $types)) {
- $this->clientError(_("Invalid license selection."));
+ // TRANS: Client error displayed selecting an invalid license in the license admin panel.
+ $this->clientError(_('Invalid license selection.'));
}
// Make sure the user has set an owner if the site has a private
@@ -141,13 +142,15 @@ class LicenseadminpanelAction extends AdminPanelAction
&& empty($values['license']['owner'])
) {
$this->clientError(
- _("You must specify the owner of the content when using the All Rights Reserved license.")
+ // TRANS: Client error displayed when not specifying an owner for the all rights reserved license in the license admin panel.
+ _('You must specify the owner of the content when using the All Rights Reserved license.')
);
}
// Make sure the license title is not too long
if (mb_strlen($values['license']['type']) > 255) {
$this->clientError(
+ // TRANS: Client error displayed selecting a too long license title in the license admin panel.
_('Invalid license title. Maximum length is 255 characters.')
);
}
@@ -160,10 +163,12 @@ class LicenseadminpanelAction extends AdminPanelAction
if ($values['license']['type'] == 'cc') {
if (!Validate::uri($values['license']['url'], $options)) {
- $this->clientError(_("Invalid license URL."));
+ // TRANS: Client error displayed specifying an invalid license URL in the license admin panel.
+ $this->clientError(_('Invalid license URL.'));
}
if (!Validate::uri($values['license']['image'], $options)) {
- $this->clientError(_("Invalid license image URL."));
+ // TRANS: Client error displayed specifying an invalid license image URL in the license admin panel.
+ $this->clientError(_('Invalid license image URL.'));
}
}
@@ -171,7 +176,8 @@ class LicenseadminpanelAction extends AdminPanelAction
if (!empty($values['license']['url'])) {
if (!Validate::uri($values['license']['url'], $options)) {
- $this->clientError(_("License URL must be blank or a valid URL."));
+ // TRANS: Client error displayed specifying an invalid license URL in the license admin panel.
+ $this->clientError(_('License URL must be blank or a valid URL.'));
}
}
@@ -179,7 +185,8 @@ class LicenseadminpanelAction extends AdminPanelAction
if (!empty($values['license']['image'])) {
if (!Validate::uri($values['license']['image'], $options)) {
- $this->clientError(_("License image must be blank or valid URL."));
+ // TRANS: Client error displayed specifying an invalid license image URL in the license admin panel.
+ $this->clientError(_('License image must be blank or valid URL.'));
}
}
}
@@ -229,22 +236,28 @@ class LicenseAdminPanelForm extends AdminForm
$this->out->elementStart(
'fieldset', array('id' => 'settings_license-selection')
);
+ // TRANS: Form legend in the license admin panel.
$this->out->element('legend', null, _('License selection'));
$this->out->elementStart('ul', 'form_data');
$this->li();
$types = array(
+ // TRANS: License option in the license admin panel.
'private' => _('Private'),
+ // TRANS: License option in the license admin panel.
'allrightsreserved' => _('All Rights Reserved'),
+ // TRANS: License option in the license admin panel.
'cc' => _('Creative Commons')
);
$this->out->dropdown(
'type',
+ // TRANS: Dropdown field label in the license admin panel.
_('Type'),
$types,
- _('Select license'),
+ // TRANS: Dropdown field instructions in the license admin panel.
+ _('Select a license.'),
false,
$this->value('type', 'license')
);
@@ -258,13 +271,16 @@ class LicenseAdminPanelForm extends AdminForm
'fieldset',
array('id' => 'settings_license-details')
);
+ // TRANS: Form legend in the license admin panel.
$this->out->element('legend', null, _('License details'));
$this->out->elementStart('ul', 'form_data');
$this->li();
$this->input(
'owner',
+ // TRANS: Field label in the license admin panel.
_('Owner'),
+ // TRANS: Field title in the license admin panel.
_('Name of the owner of the site\'s content (if applicable).'),
'license'
);
@@ -273,7 +289,9 @@ class LicenseAdminPanelForm extends AdminForm
$this->li();
$this->input(
'title',
+ // TRANS: Field label in the license admin panel.
_('License Title'),
+ // TRANS: Field title in the license admin panel.
_('The title of the license.'),
'license'
);
@@ -282,7 +300,9 @@ class LicenseAdminPanelForm extends AdminForm
$this->li();
$this->input(
'url',
+ // TRANS: Field label in the license admin panel.
_('License URL'),
+ // TRANS: Field title in the license admin panel.
_('URL for more information about the license.'),
'license'
);
@@ -290,7 +310,9 @@ class LicenseAdminPanelForm extends AdminForm
$this->li();
$this->input(
+ // TRANS: Field label in the license admin panel.
'image', _('License Image URL'),
+ // TRANS: Field title in the license admin panel.
_('URL for an image to display with the license.'),
'license'
);
@@ -308,7 +330,13 @@ class LicenseAdminPanelForm extends AdminForm
function formActions()
{
$this->out->submit(
- 'submit', _('Save'), 'submit', null, _('Save license settings')
+ 'submit',
+ // TRANS: Button text in the license admin panel.
+ _m('BUTTON','Save'),
+ 'submit',
+ null,
+ // TRANS: Button title in the license admin panel.
+ _('Save license settings.')
);
}
}
diff --git a/actions/login.php b/actions/login.php
index 8d51a01449..768bc04cef 100644
--- a/actions/login.php
+++ b/actions/login.php
@@ -94,6 +94,7 @@ class LoginAction extends Action
parent::handle($args);
if (common_is_real_login()) {
+ // TRANS: Client error displayed when trying to log in while already logged in.
$this->clientError(_('Already logged in.'));
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$this->checkLogin();
@@ -122,12 +123,14 @@ class LoginAction extends Action
$user = common_check_user($nickname, $password);
if (!$user) {
+ // TRANS: Form validation error displayed when trying to log in with incorrect credentials.
$this->showForm(_('Incorrect username or password.'));
return;
}
// success!
if (!common_set_user($user)) {
+ // TRANS: Server error displayed when during login a server error occurs.
$this->serverError(_('Error setting user. You are probably not authorized.'));
return;
}
@@ -182,6 +185,7 @@ class LoginAction extends Action
*/
function title()
{
+ // TRANS: Page title for login page.
return _('Login');
}
@@ -219,25 +223,32 @@ class LoginAction extends Action
'class' => 'form_settings',
'action' => common_local_url('login')));
$this->elementStart('fieldset');
+ // TRANS: Form legend on login page.
$this->element('legend', null, _('Login to site'));
$this->elementStart('ul', 'form_data');
$this->elementStart('li');
+ // TRANS: Field label on login page.
$this->input('nickname', _('Nickname'));
$this->elementEnd('li');
$this->elementStart('li');
+ // TRANS: Field label on login page.
$this->password('password', _('Password'));
$this->elementEnd('li');
$this->elementStart('li');
+ // TRANS: Checkbox label label on login page.
$this->checkbox('rememberme', _('Remember me'), false,
+ // TRANS: Checkbox title on login page.
_('Automatically login in the future; ' .
'not for shared computers!'));
$this->elementEnd('li');
$this->elementEnd('ul');
- $this->submit('submit', _('Login'));
+ // TRANS: Button text for log in on login page.
+ $this->submit('submit', _m('BUTTON','Login'));
$this->elementEnd('fieldset');
$this->elementEnd('form');
$this->elementStart('p');
$this->element('a', array('href' => common_local_url('recoverpassword')),
+ // TRANS: Link text for link to "reset password" on login page.
_('Lost or forgotten password?'));
$this->elementEnd('p');
}
@@ -256,13 +267,17 @@ class LoginAction extends Action
common_get_returnto()) {
// rememberme logins have to reauthenticate before
// changing any profile settings (cookie-stealing protection)
+ // TRANS: Form instructions on login page before being able to change user settings.
return _('For security reasons, please re-enter your ' .
'user name and password ' .
'before changing your settings.');
} else {
+ // TRANS: Form instructions on login page.
$prompt = _('Login with your username and password.');
if (!common_config('site', 'closed') && !common_config('site', 'inviteonly')) {
$prompt .= ' ';
+ // TRANS: Form instructions on login page. This message contains Markdown links in the form [Link text](Link).
+ // TRANS: %%action.register%% is a link to the registration page.
$prompt .= _('Don\'t have a username yet? ' .
'[Register](%%action.register%%) a new account.');
}
diff --git a/actions/logout.php b/actions/logout.php
index f747371225..8e903db221 100644
--- a/actions/logout.php
+++ b/actions/logout.php
@@ -44,7 +44,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
*/
class LogoutAction extends Action
{
-
/**
* This is read only.
*
diff --git a/actions/makeadmin.php b/actions/makeadmin.php
index 4e6e97a569..3613e1eb70 100644
--- a/actions/makeadmin.php
+++ b/actions/makeadmin.php
@@ -58,6 +58,7 @@ class MakeadminAction extends RedirectingAction
{
parent::prepare($args);
if (!common_logged_in()) {
+ // TRANS: Client error displayed when trying to access the "make admin" page while not logged in.
$this->clientError(_('Not logged in.'));
return false;
}
@@ -68,31 +69,38 @@ class MakeadminAction extends RedirectingAction
}
$id = $this->trimmed('profileid');
if (empty($id)) {
+ // TRANS: Client error displayed when not providing a profile ID on the Make Admin page.
$this->clientError(_('No profile specified.'));
return false;
}
$this->profile = Profile::staticGet('id', $id);
if (empty($this->profile)) {
+ // TRANS: Client error displayed when specifying an invalid profile ID on the Make Admin page.
$this->clientError(_('No profile with that ID.'));
return false;
}
$group_id = $this->trimmed('groupid');
if (empty($group_id)) {
+ // TRANS: Client error displayed when not providing a group ID on the Make Admin page.
$this->clientError(_('No group specified.'));
return false;
}
$this->group = User_group::staticGet('id', $group_id);
if (empty($this->group)) {
+ // TRANS: Client error displayed when providing an invalid group ID on the Make Admin page.
$this->clientError(_('No such group.'));
return false;
}
$user = common_current_user();
if (!$user->isAdmin($this->group) &&
!$user->hasRight(Right::MAKEGROUPADMIN)) {
+ // TRANS: Client error displayed when trying to make another user admin on the Make Admin page while not an admin.
$this->clientError(_('Only an admin can make another user an admin.'), 401);
return false;
}
if ($this->profile->isAdmin($this->group)) {
+ // TRANS: Client error displayed when trying to make another user admin on the Make Admin page who already is admin.
+ // TRANS: %1$s is the user that is already admin, %2$s is the group user is already admin for.
$this->clientError(sprintf(_('%1$s is already an admin for group "%2$s".'),
$this->profile->getBestName(),
$this->group->getBestName()),
@@ -130,6 +138,9 @@ class MakeadminAction extends RedirectingAction
'profile_id' => $this->profile->id));
if (empty($member)) {
+ // TRANS: Server error displayed when trying to make another user admin on the Make Admin page fails
+ // TRANS: because the group membership record could not be gotten.
+ // TRANS: %1$s is the to be admin user, %2$s is the group user should be admin for.
$this->serverError(_('Can\'t get membership record for %1$s in group %2$s.'),
$this->profile->getBestName(),
$this->group->getBestName());
@@ -143,6 +154,9 @@ class MakeadminAction extends RedirectingAction
if (!$result) {
common_log_db_error($member, 'UPDATE', __FILE__);
+ // TRANS: Server error displayed when trying to make another user admin on the Make Admin page fails
+ // TRANS: because the group adminship record coud not be saved properly.
+ // TRANS: %1$s is the to be admin user, %2$s is the group user is already admin for.
$this->serverError(_('Can\'t make %1$s an admin for group %2$s.'),
$this->profile->getBestName(),
$this->group->getBestName());
diff --git a/actions/microsummary.php b/actions/microsummary.php
index d145dc3bc7..6d47e85c68 100644
--- a/actions/microsummary.php
+++ b/actions/microsummary.php
@@ -46,7 +46,7 @@ class MicrosummaryAction extends Action
{
/**
* Class handler.
- *
+ *
* @param array $args array of arguments
*
* @return nothing
@@ -59,18 +59,20 @@ class MicrosummaryAction extends Action
$user = User::staticGet('nickname', $nickname);
if (!$user) {
+ // TRANS: Client error displayed trying to make a micro summary without providing a valid user.
$this->clientError(_('No such user.'), 404);
return;
}
-
+
$notice = $user->getCurrentNotice();
-
+
if (!$notice) {
+ // TRANS: Client error displayed trying to make a micro summary without providing a status.
$this->clientError(_('No current status.'), 404);
}
-
+
header('Content-Type: text/plain');
-
+
print $user->nickname . ': ' . $notice->content;
}
diff --git a/actions/newmessage.php b/actions/newmessage.php
index 447a00580c..8a03aebfac 100644
--- a/actions/newmessage.php
+++ b/actions/newmessage.php
@@ -68,6 +68,7 @@ class NewmessageAction extends Action
function title()
{
+ // TRANS: Page title for new direct message page.
return _('New message');
}
@@ -84,6 +85,7 @@ class NewmessageAction extends Action
parent::handle($args);
if (!common_logged_in()) {
+ // TRANS: Client error displayed trying to create a new direct message while not logged in.
$this->clientError(_('Not logged in.'), 403);
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$this->saveNewMessage();
@@ -113,12 +115,15 @@ class NewmessageAction extends Action
$this->other = User::staticGet('id', $this->to);
if (!$this->other) {
+ // TRANS: Client error displayed trying to send a direct message to a non-existing user.
$this->clientError(_('No such user.'), 404);
return false;
}
if (!$user->mutuallySubscribed($this->other)) {
- $this->clientError(_('You can\'t send a message to this user.'), 404);
+ // TRANS: Client error displayed trying to send a direct message to a user while sender and
+ // TRANS: receiver are not subscribed to each other.
+ $this->clientError(_('You cannot send a message to this user.'), 404);
return false;
}
}
@@ -141,6 +146,7 @@ class NewmessageAction extends Action
assert($user); // XXX: maybe an error instead...
if (!$this->content) {
+ // TRANS: Form validator error displayed trying to send a direct message without content.
$this->showForm(_('No content!'));
return;
} else {
@@ -158,12 +164,16 @@ class NewmessageAction extends Action
}
if (!$this->other) {
+ // TRANS: Form validation error displayed trying to send a direct message without specifying a recipient.
$this->showForm(_('No recipient specified.'));
return;
} else if (!$user->mutuallySubscribed($this->other)) {
- $this->clientError(_('You can\'t send a message to this user.'), 404);
+ // TRANS: Client error displayed trying to send a direct message to a user while sender and
+ // TRANS: receiver are not subscribed to each other.
+ $this->clientError(_('You cannot send a message to this user.'), 404);
return;
} else if ($user->id == $this->other->id) {
+ // TRANS: Client error displayed trying to send a direct message to self.
$this->clientError(_('Don\'t send a message to yourself; ' .
'just say it to yourself quietly instead.'), 403);
return;
@@ -181,10 +191,13 @@ class NewmessageAction extends Action
if ($this->boolean('ajax')) {
$this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head');
+ // TRANS: Page title after sending a direct message.
$this->element('title', null, _('Message sent'));
$this->elementEnd('head');
$this->elementStart('body');
$this->element('p', array('id' => 'command_result'),
+ // TRANS: Confirmation text after sending a direct message.
+ // TRANS: %s is the direct message recipient.
sprintf(_('Direct message to %s sent.'),
$this->other->nickname));
$this->elementEnd('body');
@@ -210,6 +223,7 @@ class NewmessageAction extends Action
{
$this->startHTML('text/xml;charset=utf-8', true);
$this->elementStart('head');
+ // TRANS: Page title after an AJAX error occurred on the "send direct message" page.
$this->element('title', null, _('Ajax Error'));
$this->elementEnd('head');
$this->elementStart('body');
@@ -231,6 +245,7 @@ class NewmessageAction extends Action
$this->xw->startDocument('1.0', 'UTF-8');
$this->elementStart('html');
$this->elementStart('head');
+ // TRANS: Page title on page for sending a direct message.
$this->element('title', null, _('New message'));
$this->elementEnd('head');
$this->elementStart('body');
diff --git a/actions/newnotice.php b/actions/newnotice.php
index faafd9551d..3e601ae362 100644
--- a/actions/newnotice.php
+++ b/actions/newnotice.php
@@ -47,13 +47,11 @@ require_once INSTALLDIR . '/lib/mediafile.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
-
class NewnoticeAction extends Action
{
/**
* Error message, if any
*/
-
var $msg = null;
/**
@@ -63,9 +61,9 @@ class NewnoticeAction extends Action
*
* @return string page title
*/
-
function title()
{
+ // TRANS: Page title for sending a new notice.
return _('New notice');
}
@@ -85,6 +83,7 @@ class NewnoticeAction extends Action
function handle($args)
{
if (!common_logged_in()) {
+ // TRANS: Client error displayed trying to send a notice while not logged in.
$this->clientError(_('Not logged in.'));
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// check for this before token since all POST and FILES data
@@ -127,7 +126,6 @@ class NewnoticeAction extends Action
*
* @return void
*/
-
function saveNewNotice()
{
$user = common_current_user();
@@ -137,6 +135,7 @@ class NewnoticeAction extends Action
Event::handle('StartSaveNewNoticeWeb', array($this, $user, &$content, &$options));
if (!$content) {
+ // TRANS: Client error displayed trying to send a notice without content.
$this->clientError(_('No content!'));
return;
}
@@ -227,6 +226,7 @@ class NewnoticeAction extends Action
$this->xw->startDocument('1.0', 'UTF-8');
$this->elementStart('html');
$this->elementStart('head');
+ // TRANS: Page title after sending a notice.
$this->element('title', null, _('Notice posted'));
$this->elementEnd('head');
$this->elementStart('body');
@@ -256,11 +256,11 @@ class NewnoticeAction extends Action
*
* @return void
*/
-
function ajaxErrorMsg($msg)
{
$this->startHTML('text/xml;charset=utf-8', true);
$this->elementStart('head');
+ // TRANS: Page title after an AJAX error occurs on the send notice page.
$this->element('title', null, _('Ajax Error'));
$this->elementEnd('head');
$this->elementStart('body');
@@ -269,6 +269,30 @@ class NewnoticeAction extends Action
$this->elementEnd('html');
}
+ /**
+ * Show an Ajax-y notice form
+ *
+ * Goes back to the browser, where it's shown in a popup.
+ *
+ * @param string $msg Message to show
+ *
+ * @return void
+ */
+ function ajaxShowForm()
+ {
+ $this->startHTML('text/xml;charset=utf-8', true);
+ $this->elementStart('head');
+ $this->element('title', null, _('New notice'));
+ $this->elementEnd('head');
+ $this->elementStart('body');
+
+ $form = new NoticeForm($this);
+ $form->show();
+
+ $this->elementEnd('body');
+ $this->elementEnd('html');
+ }
+
/**
* Formerly page output
*
@@ -283,11 +307,14 @@ class NewnoticeAction extends Action
*
* @return void
*/
-
function showForm($msg=null)
{
- if ($msg && $this->boolean('ajax')) {
- $this->ajaxErrorMsg($msg);
+ if ($this->boolean('ajax')) {
+ if ($msg) {
+ $this->ajaxErrorMsg($msg);
+ } else {
+ $this->ajaxShowForm();
+ }
return;
}
@@ -302,7 +329,6 @@ class NewnoticeAction extends Action
*
* @return void
*/
-
function showNoticeForm()
{
$content = $this->trimmed('status_textarea');
@@ -331,7 +357,6 @@ class NewnoticeAction extends Action
*
* @todo maybe show some instructions?
*/
-
function showPageNotice()
{
if ($this->msg) {
@@ -348,7 +373,6 @@ class NewnoticeAction extends Action
*
* @return void
*/
-
function showNotice($notice)
{
$nli = new NoticeListItem($notice, $this);
diff --git a/actions/nudge.php b/actions/nudge.php
index 219a8c9aba..61874c7505 100644
--- a/actions/nudge.php
+++ b/actions/nudge.php
@@ -60,6 +60,7 @@ class NudgeAction extends Action
parent::handle($args);
if (!common_logged_in()) {
+ // TRANS: Client error displayed trying to nudge a user without being logged in.
$this->clientError(_('Not logged in.'));
return;
}
@@ -82,6 +83,7 @@ class NudgeAction extends Action
}
if (!$other->email || !$other->emailnotifynudge) {
+ // TRANS: Client error displayed trying to nudge a user that cannot be nudged.
$this->clientError(_('This user doesn\'t allow nudges or hasn\'t confirmed or set their email address yet.'));
return;
}
@@ -91,9 +93,11 @@ class NudgeAction extends Action
if ($this->boolean('ajax')) {
$this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head');
+ // TRANS: Page title after sending a nudge.
$this->element('title', null, _('Nudge sent'));
$this->elementEnd('head');
$this->elementStart('body');
+ // TRANS: Confirmation text after sending a nudge.
$this->element('p', array('id' => 'nudge_response'), _('Nudge sent!'));
$this->elementEnd('body');
$this->elementEnd('html');
@@ -129,4 +133,3 @@ class NudgeAction extends Action
return true;
}
}
-
diff --git a/actions/oembed.php b/actions/oembed.php
index 0d8be55656..e293e4d27d 100644
--- a/actions/oembed.php
+++ b/actions/oembed.php
@@ -61,6 +61,8 @@ class OembedAction extends Action
$proxy_args = $r->map($path);
if (!$proxy_args) {
+ // TRANS: Server error displayed in oEmbed action when path not found.
+ // TRANS: %s is a path.
$this->serverError(sprintf(_('"%s" not found.'),$path), 404);
}
$oembed=array();
@@ -73,13 +75,17 @@ class OembedAction extends Action
$id = $proxy_args['notice'];
$notice = Notice::staticGet($id);
if(empty($notice)){
+ // TRANS: Server error displayed in oEmbed action when notice not found.
+ // TRANS: %s is a notice.
$this->serverError(sprintf(_("Notice %s not found."),$id), 404);
}
$profile = $notice->getProfile();
if (empty($profile)) {
+ // TRANS: Server error displayed in oEmbed action when notice has not profile.
$this->serverError(_('Notice has no profile.'), 500);
}
$authorname = $profile->getFancyName();
+ // TRANS: oEmbed title. %1$s is the author name, %2$s is the creation date.
$oembed['title'] = sprintf(_('%1$s\'s status on %2$s'),
$authorname,
common_exact_date($notice->created));
@@ -92,6 +98,8 @@ class OembedAction extends Action
$id = $proxy_args['attachment'];
$attachment = File::staticGet($id);
if(empty($attachment)){
+ // TRANS: Server error displayed in oEmbed action when attachment not found.
+ // TRANS: %d is an attachment ID.
$this->serverError(sprintf(_('Attachment %s not found.'),$id), 404);
}
if(empty($attachment->filename) && $file_oembed = File_oembed::staticGet('file_id', $attachment->id)){
@@ -133,6 +141,8 @@ class OembedAction extends Action
if($attachment->title) $oembed['title']=$attachment->title;
break;
default:
+ // TRANS: Server error displayed in oEmbed request when a path is not supported.
+ // TRANS: %s is a path.
$this->serverError(sprintf(_('"%s" not supported for oembed requests.'),$path), 501);
}
switch($args['format']){
@@ -190,6 +200,7 @@ class OembedAction extends Action
}
break;
default:
+ // TRANS: Server error displayed in oEmbed action when request specifies an unsupported data format.
$this->serverError(_('Not a supported data format.'), 501);
break;
}
@@ -209,6 +220,7 @@ class OembedAction extends Action
}
break;
default:
+ // TRANS: Server error displayed in oEmbed action when request specifies an unsupported data format.
$this->serverError(_('Not a supported data format.'), 501);
break;
}
diff --git a/actions/opensearch.php b/actions/opensearch.php
index 7bf32277bb..b1529860a8 100644
--- a/actions/opensearch.php
+++ b/actions/opensearch.php
@@ -63,8 +63,8 @@ class OpensearchAction extends Action
// TRANS: ShortName in the OpenSearch interface when trying to find users.
$short_name = _('People Search');
} else {
- // TRANS: ShortName in the OpenSearch interface when trying to find notices.
$type = 'noticesearch';
+ // TRANS: ShortName in the OpenSearch interface when trying to find notices.
$short_name = _('Notice Search');
}
header('Content-Type: application/opensearchdescription+xml');
diff --git a/js/util.js b/js/util.js
index 3cd4bbbe44..cc94c5ced7 100644
--- a/js/util.js
+++ b/js/util.js
@@ -50,12 +50,6 @@ var SN = { // StatusNet
Processing: 'processing',
CommandResult: 'command_result',
FormNotice: 'form_notice',
- NoticeInReplyTo: 'notice_in-reply-to',
- NoticeLat: 'notice_data-lat',
- NoticeLon: 'notice_data-lon',
- NoticeLocationId: 'notice_data-location_id',
- NoticeLocationNs: 'notice_data-location_ns',
- NoticeGeoName: 'notice_data-geo_name',
NoticeDataGeo: 'notice_data-geo',
NoticeDataGeoCookie: 'NoticeDataGeo',
NoticeDataGeoSelected: 'notice_data-geo_selected',
@@ -393,9 +387,24 @@ var SN = { // StatusNet
// New notice post was successful. If on our timeline, show it!
var notice = document._importNode($('li', data)[0], true);
var notices = $('#notices_primary .notices:first');
- if (notices.length > 0 && SN.U.belongsOnTimeline(notice)) {
+ var replyItem = form.closest('li.notice-reply');
+
+ if (replyItem.length > 0) {
+ // If this is an inline reply, insert it in place.
+ var id = $(notice).attr('id');
+ if ($("#"+id).length == 0) {
+ var parentNotice = replyItem.closest('li.notice');
+ replyItem.replaceWith(notice);
+ SN.U.NoticeInlineReplyPlaceholder(parentNotice);
+ } else {
+ // Realtime came through before us...
+ replyItem.remove();
+ }
+ } else if (notices.length > 0 && SN.U.belongsOnTimeline(notice)) {
+ // Not a reply. If on our timeline, show it at the top!
+
if ($('#'+notice.id).length === 0) {
- var notice_irt_value = $('#'+SN.C.S.NoticeInReplyTo).val();
+ var notice_irt_value = form.find('[name=inreplyto]').val();
var notice_irt = '#notices_primary #notice-'+notice_irt_value;
if($('body')[0].id == 'conversation') {
if(notice_irt_value.length > 0 && $(notice_irt+' .notices').length < 1) {
@@ -412,10 +421,10 @@ var SN = { // StatusNet
SN.U.NoticeWithAttachment($('#'+notice.id));
SN.U.NoticeReplyTo($('#'+notice.id));
}
- }
- else {
+ } else {
// Not on a timeline that this belongs on?
// Just show a success message.
+ // @fixme inline
showFeedback('success', $('title', data).text());
}
}
@@ -559,105 +568,55 @@ var SN = { // StatusNet
// See if the form's already open...
var replyForm = $('.notice-reply-form', list);
- if (replyForm.length == 0) {
+
+ var nextStep = function() {
+ // Override...?
+ replyForm.find('input[name=inreplyto]').val(id);
+
+ // Set focus...
+ var text = replyForm.find('textarea');
+ if (text.length == 0) {
+ throw "No textarea";
+ }
+ var replyto = '';
+ if (initialText) {
+ replyto = initialText + ' ';
+ }
+ text.val(replyto + text.val().replace(RegExp(replyto, 'i'), ''));
+ text.data('initialText', $.trim(initialText + ''));
+ text.focus();
+ if (text[0].setSelectionRange) {
+ var len = text.val().length;
+ text[0].setSelectionRange(len,len);
+ }
+ };
+ if (replyForm.length > 0) {
+ // Update the existing form...
+ nextStep();
+ } else {
// Remove placeholder if any
$('li.notice-reply-placeholder').remove();
// Create the reply form entry at the end
var replyItem = $('li.notice-reply', list);
if (replyItem.length == 0) {
- replyItem = $('
' +
- '' +
- '
');
+ var url = $('#form_notice').attr('action');
+ replyItem = $('');
+ $.get(url, {ajax: 1}, function(data, textStatus, xhr) {
+ var formEl = document._importNode($('form', data)[0], true);
+ replyItem.append(formEl);
+ list.append(replyItem);
- var baseForm = $('#form_notice');
- replyForm = replyItem.find('form');
- replyForm.attr('action', baseForm.attr('action'));
- replyForm.find('input[name="token"]').val(baseForm.find('input[name=token]').val());
- replyForm.find('input[type="submit"]').val(SN.msg('reply_submit'));
- list.append(replyItem);
+ var form = replyForm = $(formEl);
+ SN.U.NoticeLocationAttach(form);
+ SN.U.FormNoticeXHR(form);
+ SN.U.FormNoticeEnhancements(form);
+ SN.U.NoticeDataAttach(form);
- replyForm.find('textarea').blur(function() {
- var textarea = $(this);
- var txt = $.trim(textarea.val());
- if (txt == '' || txt == textarea.data('initialText')) {
- // Nothing to say? Begone!
- replyItem.remove();
- if (list.find('li').length > 0) {
- SN.U.NoticeInlineReplyPlaceholder(parentNotice);
- } else {
- list.remove();
- }
- }
- });
- replyForm.submit(function(event) {
- var form = replyForm;
- $.ajax({
- type: 'POST',
- dataType: 'xml',
- url: SN.U.RewriteAjaxAction(form.attr('action')),
- data: form.serialize() + '&ajax=1',
- beforeSend: function(xhr) {
- form
- .addClass(SN.C.S.Processing)
- .find('.submit')
- .addClass(SN.C.S.Disabled)
- .attr(SN.C.S.Disabled, SN.C.S.Disabled)
- .end()
- .find('textarea')
- .addClass(SN.C.S.Disabled)
- .attr(SN.C.S.Disabled, SN.C.S.Disabled);
- },
- error: function (xhr, textStatus, errorThrown) {
- alert(errorThrown || textStatus);
- },
- success: function(data, textStatus) {
- var orig_li = $('li', data)[0];
- if (orig_li) {
- var li = document._importNode(orig_li, true);
- var id = $(li).attr('id');
- if ($("#"+id).length == 0) {
- replyItem.replaceWith(li);
- SN.U.NoticeInlineReplyPlaceholder(parentNotice);
- } else {
- // Realtime came through before us...
- replyItem.remove();
- }
- }
- }
- });
- event.preventDefault();
- return false;
+ nextStep();
});
}
}
-
- // Override...?
- replyForm.find('input[name=inreplyto]').val(id);
-
- // Set focus...
- var text = replyForm.find('textarea');
- if (text.length == 0) {
- throw "No textarea";
- }
- var replyto = '';
- if (initialText) {
- replyto = initialText + ' ';
- }
- text.val(replyto + text.val().replace(RegExp(replyto, 'i'), ''));
- text.data('initialText', $.trim(initialText + ''));
- text.focus();
- if (text[0].setSelectionRange) {
- var len = text.val().length;
- text[0].setSelectionRange(len,len);
- }
},
/**
@@ -972,12 +931,14 @@ var SN = { // StatusNet
var NLon = form.find('[name=lon]')
var NLNS = form.find('[name=location_ns]').val();
var NLID = form.find('[name=location_id]').val();
- var NLN = $('#'+SN.C.S.NoticeGeoName).text(); // @fixme does this exist?
+ var NLN = ''; // @fixme
var NDGe = form.find('[name=notice_data-geo]');
+ var check = form.find('[name=notice_data-geo]');
+ var label = form.find('label.notice_data-geo');
function removeNoticeDataGeo(error) {
- $('label[for='+SN.C.S.NoticeDataGeo+']')
- .attr('title', jQuery.trim($('label[for='+SN.C.S.NoticeDataGeo+']').text()))
+ label
+ .attr('title', jQuery.trim(label.text()))
.removeClass('checked');
form.find('[name=lat]').val('');
@@ -989,15 +950,15 @@ var SN = { // StatusNet
$.cookie(SN.C.S.NoticeDataGeoCookie, 'disabled', { path: '/' });
if (error) {
- $('.geo_status_wrapper').removeClass('success').addClass('error');
- $('.geo_status_wrapper .geo_status').text(error);
+ form.find('.geo_status_wrapper').removeClass('success').addClass('error');
+ form.find('.geo_status_wrapper .geo_status').text(error);
} else {
- $('.geo_status_wrapper').remove();
+ form.find('.geo_status_wrapper').remove();
}
}
function getJSONgeocodeURL(geocodeURL, data) {
- SN.U.NoticeGeoStatus('Looking up place name...');
+ SN.U.NoticeGeoStatus(form, 'Looking up place name...');
$.getJSON(geocodeURL, data, function(location) {
var lns, lid;
@@ -1018,8 +979,8 @@ var SN = { // StatusNet
NLN_text = location.name;
}
- SN.U.NoticeGeoStatus(NLN_text, data.lat, data.lon, location.url);
- $('label[for='+SN.C.S.NoticeDataGeo+']')
+ SN.U.NoticeGeoStatus(form, NLN_text, data.lat, data.lon, location.url);
+ label
.attr('title', NoticeDataGeo_text.ShareDisable + ' (' + NLN_text + ')');
form.find('[name=lat]').val(data.lat);
@@ -1042,30 +1003,30 @@ var SN = { // StatusNet
});
}
- if (NDGe.length > 0) {
+ if (check.length > 0) {
if ($.cookie(SN.C.S.NoticeDataGeoCookie) == 'disabled') {
- NDGe.attr('checked', false);
+ check.attr('checked', false);
}
else {
- NDGe.attr('checked', true);
+ check.attr('checked', true);
}
- var NGW = $('#notice_data-geo_wrap');
+ var NGW = form.find('.notice_data-geo_wrap');
var geocodeURL = NGW.attr('title');
NGW.removeAttr('title');
- $('label[for='+SN.C.S.NoticeDataGeo+']')
- .attr('title', jQuery.trim($('label[for='+SN.C.S.NoticeDataGeo+']').text()));
+ label
+ .attr('title', label.text());
- NDGe.change(function() {
- if ($('#'+SN.C.S.NoticeDataGeo).attr('checked') === true || $.cookie(SN.C.S.NoticeDataGeoCookie) === null) {
- $('label[for='+SN.C.S.NoticeDataGeo+']')
+ check.change(function() {
+ if (check.attr('checked') === true || $.cookie(SN.C.S.NoticeDataGeoCookie) === null) {
+ label
.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('Requesting location from browser...');
+ SN.U.NoticeGeoStatus(form, 'Requesting location from browser...');
navigator.geolocation.getCurrentPosition(
function(position) {
form.find('[name=lat]').val(position.coords.latitude);
@@ -1109,8 +1070,8 @@ var SN = { // StatusNet
}
else {
removeNoticeDataGeo();
- $('#'+SN.C.S.NoticeDataGeo).remove();
- $('label[for='+SN.C.S.NoticeDataGeo+']').remove();
+ check.remove();
+ label.remove();
}
}
}
@@ -1123,8 +1084,8 @@ var SN = { // StatusNet
form.find('[name=location_id]').val(cookieValue.NLID);
form.find('[name=notice_data-geo]').attr('checked', cookieValue.NDG);
- SN.U.NoticeGeoStatus(cookieValue.NLN, cookieValue.NLat, cookieValue.NLon, cookieValue.NLNU);
- $('label[for='+SN.C.S.NoticeDataGeo+']')
+ SN.U.NoticeGeoStatus(form, cookieValue.NLN, cookieValue.NLat, cookieValue.NLon, cookieValue.NLNU);
+ label
.attr('title', NoticeDataGeo_text.ShareDisable + ' (' + cookieValue.NLN + ')')
.addClass('checked');
}
@@ -1139,19 +1100,19 @@ var SN = { // StatusNet
/**
* Create or update a geolocation status widget in this notice posting form.
*
+ * @param {jQuery} form
* @param {String} status
* @param {String} lat (optional)
* @param {String} lon (optional)
* @param {String} url (optional)
*/
- NoticeGeoStatus: function(status, lat, lon, url)
+ NoticeGeoStatus: function(form, status, lat, lon, url)
{
- var form = $('#form_notice');
var wrapper = form.find('.geo_status_wrapper');
if (wrapper.length == 0) {
wrapper = $('
');
wrapper.find('button.close').click(function() {
- $('#'+SN.C.S.NoticeDataGeo).removeAttr('checked').change();
+ form.find('[name=notice_data-geo]').removeAttr('checked').change();
});
form.append(wrapper);
}
diff --git a/js/util.min.js b/js/util.min.js
index 52a361bc13..280aca6a45 100644
--- a/js/util.min.js
+++ b/js/util.min.js
@@ -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",NoticeInReplyTo:"notice_in-reply-to",NoticeLat:"notice_data-lat",NoticeLon:"notice_data-lon",NoticeLocationId:"notice_data-location_id",NoticeLocationNs:"notice_data-location_ns",NoticeGeoName:"notice_data-geo_name",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('');b.attr("action",SN.U.RewriteAjaxAction(b.attr("action")));var c=function(d,e){b.append($('').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,k){a();var e=$("#"+SN.C.S.Error,i);if(e.length>0){c("error",e.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 h=document._importNode($("li",i)[0],true);var j=$("#notices_primary .notices:first");if(j.length>0&&SN.U.belongsOnTimeline(h)){if($("#"+h.id).length===0){var f=$("#"+SN.C.S.NoticeInReplyTo).val();var g="#notices_primary #notice-"+f;if($("body")[0].id=="conversation"){if(f.length>0&&$(g+" .notices").length<1){$(g).append('
');h.find("button.close").click(function(){$("#"+SN.C.S.NoticeDataGeo).removeAttr("checked").change()});e.append(h)}var b;if(c){b=$("").attr("href",c)}else{b=$("")}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('');$(".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});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})},UploadForms:function(){$("input[type=file]").change(function(d){if(typeof this.files=="object"&&this.files.length>0){var c=0;for(var b=0;b0&&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(!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;c0){for(var c=0,b=e.childNodes.length;c0){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()})()};
\ No newline at end of file
+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('');b.attr("action",SN.U.RewriteAjaxAction(b.attr("action")));var c=function(d,e){b.append($('').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('