EndGroupProfileElements: Start showing stuff about the group on its profile page
- $action: action being executed (for output and params)
- $group: group for the page
+
+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
);
$subtitle = sprintf(
- // TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+ // TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
_('%1$s groups %2$s is a member of.'),
$sitename,
$this->user->nickname
$this->clientError(_('Atom post must not be empty.'));
}
- $dom = DOMDocument::loadXML($xml);
- if (!$dom) {
+ $old = error_reporting(error_reporting() & ~(E_WARNING | E_NOTICE));
+ $dom = new DOMDocument();
+ $ok = $dom->loadXML($xml);
+ error_reporting($old);
+ if (!$ok) {
// TRANS: Client error displayed attempting to post an API that is not well-formed XML.
$this->clientError(_('Atom post must be well-formed XML.'));
}
function showNoticeForm()
{
}
+
+ function showProfileBlock()
+ {
+ }
}
$this->elementEnd('div');
return;
}
- $terms = preg_split('/[\s,]+/', $q);
- $nl = new SearchNoticeList($notice, $this, $terms);
- $cnt = $nl->show();
- $this->pagination($page > 1, $cnt > NOTICES_PER_PAGE,
- $page, 'noticesearch', array('q' => $q));
+ if (Event::handle('StartNoticeSearchShowResults', array($this, $q, $notice))) {
+ $terms = preg_split('/[\s,]+/', $q);
+ $nl = new SearchNoticeList($notice, $this, $terms);
+ $cnt = $nl->show();
+ $this->pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+ $page, 'noticesearch', array('q' => $q));
+ Event::handle('EndNoticeSearchShowResults', array($this, $q, $notice));
+ }
}
function showScripts()
function showNoticeForm()
{
}
+
+ function showProfileBlock()
+ {
+ }
}
*/
function showContent()
{
- $this->showGroupProfile();
- $this->showGroupActions();
$this->showGroupNotices();
}
array('nickname' => $this->group->nickname));
}
- /**
- * Show the group profile
- *
- * Information about the group
- *
- * @return void
- */
- function showGroupProfile()
- {
- $this->elementStart('div', array('id' => 'i',
- 'class' => 'entity_profile vcard author'));
-
- $logo = ($this->group->homepage_logo) ?
- $this->group->homepage_logo : User_group::defaultLogo(AVATAR_PROFILE_SIZE);
-
- $this->element('img', array('src' => $logo,
- 'class' => 'photo avatar entity_depiction',
- 'width' => AVATAR_PROFILE_SIZE,
- 'height' => AVATAR_PROFILE_SIZE,
- 'alt' => $this->group->nickname));
-
- $hasFN = ($this->group->fullname) ? 'entity_nickname nickname url uid' :
- 'entity_nickname fn org nickname url uid';
- $this->element('a', array('href' => $this->group->homeUrl(),
- 'rel' => 'me', 'class' => $hasFN),
- $this->group->nickname);
-
- if ($this->group->fullname) {
- $this->element('div', 'entity_fn fn org', $this->group->fullname);
- }
-
- if ($this->group->location) {
- $this->element('div', 'entity_location label', $this->group->location);
- }
-
- if ($this->group->homepage) {
- $this->element('a', array('href' => $this->group->homepage,
- 'rel' => 'me',
- 'class' => 'url entity_url'),
- $this->group->homepage);
- }
-
- if ($this->group->description) {
- $this->element('div', 'note entity_note', $this->group->description);
- }
-
- if (common_config('group', 'maxaliases') > 0) {
- $aliases = $this->group->getAliases();
-
- if (!empty($aliases)) {
- $this->element('div',
- 'aliases entity_aliases',
- implode(' ', $aliases));
- }
-
- if ($this->group->description) {
- $this->elementStart('dl', 'entity_note');
- // TRANS: Label for group description or group note (dt). Text hidden by default.
- $this->element('dt', null, _('Note'));
- $this->element('dd', 'note', $this->group->description);
- $this->elementEnd('dl');
- }
-
- if (common_config('group', 'maxaliases') > 0) {
- $aliases = $this->group->getAliases();
-
- if (!empty($aliases)) {
- $this->elementStart('dl', 'entity_aliases');
- // TRANS: Label for group aliases (dt). Text hidden by default.
- $this->element('dt', null, _('Aliases'));
- $this->element('dd', 'aliases', implode(' ', $aliases));
- $this->elementEnd('dl');
- }
- }
-
- Event::handle('EndGroupProfileElements', array($this, $this->group));
- }
-
- $this->elementEnd('div');
- }
-
- function showGroupActions()
- {
- $cur = common_current_user();
- $this->elementStart('div', 'entity_actions');
- // TRANS: Group actions header (h2). Text hidden by default.
- $this->element('h2', null, _('Group actions'));
- $this->elementStart('ul');
- if (Event::handle('StartGroupActionsList', array($this, $this->group))) {
- $this->elementStart('li', 'entity_subscribe');
- if (Event::handle('StartGroupSubscribe', array($this, $this->group))) {
- if ($cur) {
- if ($cur->isMember($this->group)) {
- $lf = new LeaveForm($this, $this->group);
- $lf->show();
- } else if (!Group_block::isBlocked($this->group, $cur->getProfile())) {
- $jf = new JoinForm($this, $this->group);
- $jf->show();
- }
- }
- Event::handle('EndGroupSubscribe', array($this, $this->group));
- }
- $this->elementEnd('li');
- if ($cur && $cur->hasRight(Right::DELETEGROUP)) {
- $this->elementStart('li', 'entity_delete');
- $df = new DeleteGroupForm($this, $this->group);
- $df->show();
- $this->elementEnd('li');
- }
- Event::handle('EndGroupActionsList', array($this, $this->group));
- }
- $this->elementEnd('ul');
- $this->elementEnd('div');
- }
-
/**
* Get a list of the feeds for this page
*
// TRANS: Header for group statistics on a group page (h2).
$this->element('h2', null, _('Statistics'));
- $this->elementEnd('dl');
+ $this->elementStart('dl');
$this->element('dt', null, _m('LABEL','Created'));
$this->element('dd', 'entity_created', date('j M Y',
strtotime($this->group->created)));
function prepare($args)
{
parent::prepare($args);
+ if ($this->boolean('ajax')) {
+ StatusNet::setApi(true);
+ }
$id = $this->arg('notice');
{
parent::handle($args);
- if ($this->notice->is_local == Notice::REMOTE_OMB) {
- if (!empty($this->notice->url)) {
- $target = $this->notice->url;
- } else if (!empty($this->notice->uri) && preg_match('/^https?:/', $this->notice->uri)) {
- // Old OMB posts saved the remote URL only into the URI field.
- $target = $this->notice->uri;
- } else {
- // Shouldn't happen.
- $target = false;
- }
- if ($target && $target != $this->selfUrl()) {
- common_redirect($target, 301);
- return false;
+ if ($this->boolean('ajax')) {
+ $this->showAjax();
+ } else {
+ if ($this->notice->is_local == Notice::REMOTE_OMB) {
+ if (!empty($this->notice->url)) {
+ $target = $this->notice->url;
+ } else if (!empty($this->notice->uri) && preg_match('/^https?:/', $this->notice->uri)) {
+ // Old OMB posts saved the remote URL only into the URI field.
+ $target = $this->notice->uri;
+ } else {
+ // Shouldn't happen.
+ $target = false;
+ }
+ if ($target && $target != $this->selfUrl()) {
+ common_redirect($target, 301);
+ return false;
+ }
}
+ $this->showPage();
}
- $this->showPage();
}
/**
$this->elementEnd('ol');
}
+ function showAjax()
+ {
+ header('Content-Type: text/xml;charset=utf-8');
+ $this->xw->startDocument('1.0', 'UTF-8');
+ $this->elementStart('html');
+ $this->elementStart('head');
+ $this->element('title', null, _('Notice'));
+ $this->elementEnd('head');
+ $this->elementStart('body');
+ $nli = new NoticeListItem($this->notice, $this);
+ $nli->show();
+ $this->elementEnd('body');
+ $this->elementEnd('html');
+ }
+
/**
* Don't show page notice
*
}
require_once INSTALLDIR.'/lib/personalgroupnav.php';
-require_once INSTALLDIR.'/lib/userprofile.php';
require_once INSTALLDIR.'/lib/noticelist.php';
require_once INSTALLDIR.'/lib/profileminilist.php';
require_once INSTALLDIR.'/lib/groupminilist.php';
function showContent()
{
- $this->showProfile();
$this->showNotices();
}
$nav->show();
}
+ function showProfileBlock()
+ {
+ $block = new AccountProfileBlock($this, $this->profile);
+ $block->show();
+ }
+
function showPageNoticeBlock()
{
return;
'href' => $rsd));
}
- function showProfile()
- {
- $profile = new UserProfile($this, $this->user, $this->profile);
- $profile->show();
- }
-
function showEmptyListMessage()
{
// TRANS: First sentence of empty list message for a stream. $1%s is a user nickname.
// We don't show the author for a profile, since we already know who it is!
+/**
+ * Slightly modified from standard list; the author & avatar are hidden
+ * in CSS. We used to remove them here too, but as it turns out that
+ * confuses the inline reply code... and we hide them in CSS anyway
+ * since realtime updates come through in original form.
+ *
+ * Remaining customization right now is for the repeat marker, where
+ * it'll list who the original poster was instead of who did the repeat
+ * (since the repeater is you, and the repeatee isn't shown!)
+ * This will remain inconsistent if realtime updates come through,
+ * since those'll get rendered as a regular NoticeListItem.
+ */
class ProfileNoticeList extends NoticeList
{
function newListItem($notice)
class ProfileNoticeListItem extends DoFollowListItem
{
- function showAuthor()
- {
- return;
- }
-
/**
* show a link to the author of repeat
*
if (!$result) {
common_log_db_error($confirm, 'DELETE', __FILE__);
// TRANS: Server error thrown on database error canceling SMS phone number confirmation.
- $this->serverError(_('Could not delete email confirmation.'));
+ $this->serverError(_('Could not delete SMS confirmation.'));
return;
}
require_once(INSTALLDIR.'/lib/settingsaction.php');
+// @todo FIXME: documentation missing.
class TagotherAction extends Action
{
var $profile = null;
$this->elementStart('li');
$this->input('tags', _('Tags'),
($this->arg('tags')) ? $this->arg('tags') : implode(' ', Profile_tag::getTags($user->id, $this->profile->id)),
- _('Tags for this user (letters, numbers, -, ., and _), comma- or space- separated'));
+ _('Tags for this user (letters, numbers, -, ., and _), separated by commas or spaces.'));
$this->elementEnd('li');
$this->elementEnd('ul');
- $this->submit('save', _('Save'));
+ $this->submit('save', _m('BUTTON','Save'));
$this->elementEnd('fieldset');
$this->elementEnd('form');
}
foreach ($tags as $tag) {
if (!common_valid_profile_tag($tag)) {
- $this->showForm(sprintf(_('Invalid tag: "%s"'), $tag));
+ // TRANS: Form validation error when entering an invalid tag.
+ // TRANS: %s is the invalid tag.
+ $this->showForm(sprintf(_('Invalid tag: "%s".'), $tag));
return;
}
}
}
}
}
-
$this->raw(common_markup_to_html($message));
$this->elementEnd('div');
}
+
+ function showProfileBlock()
+ {
+ $block = new AccountProfileBlock($this, $this->profile);
+ $block->show();
+ }
}
$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 ($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)) {
$this->is_local == Notice::LOCAL_NONPUBLIC);
}
+ /**
+ * Get the list of hash tags saved with this notice.
+ *
+ * @return array of strings
+ */
public function getTags()
{
$tags = array();
--- /dev/null
+/*
+ * jQuery UI CSS Framework 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+ * jQuery UI CSS Framework 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
+ * jQuery UI Resizable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
+ * jQuery UI Selectable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
+/*
+ * jQuery UI Accordion 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
+/*
+ * jQuery UI Autocomplete 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.10
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+ list-style:none;
+ padding: 2px;
+ margin: 0;
+ display:block;
+ float: left;
+}
+.ui-menu .ui-menu {
+ margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+ margin:0;
+ padding: 0;
+ zoom: 1;
+ float: left;
+ clear: left;
+ width: 100%;
+}
+.ui-menu .ui-menu-item a {
+ text-decoration:none;
+ display:block;
+ padding:.2em .4em;
+ line-height:1.5;
+ zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+ font-weight: normal;
+ margin: -1px;
+}
+/*
+ * jQuery UI Button 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; }
+button.ui-button-icons-only { width: 3.7em; }
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4; }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+/*
+ * jQuery UI Dialog 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
+/*
+ * jQuery UI Slider 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
+ * jQuery UI Tabs 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
+/*
+ * jQuery UI Datepicker 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+ display: none; /*sorry for IE5*/
+ display/**/: block; /*sorry for IE5*/
+ position: absolute; /*must have*/
+ z-index: -1; /*must have*/
+ filter: mask(); /*must have*/
+ top: -4px; /*must have*/
+ left: -4px; /*must have*/
+ width: 200px; /*must have*/
+ height: 200px; /*must have*/
+}/*
+ * jQuery UI Progressbar 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
\ No newline at end of file
--- /dev/null
+/*!
+ * jQuery UI 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c,j){function k(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.10",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,
+NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,
+"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");
+if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f,
+"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,
+d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}});
+c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&
+b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&c.ui.isOverAxis(b,e,i)}})}})(jQuery);
+;/*!
+ * jQuery UI Widget 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
+a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
+e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
+this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
+widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
+enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
+;/*!
+ * jQuery UI Mouse 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(b){return a._mouseDown(b)}).bind("click."+this.widgetName,function(b){if(true===c.data(b.target,a.widgetName+".preventClickEvent")){c.removeData(b.target,a.widgetName+".preventClickEvent");b.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=
+a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var b=this,e=a.which==1,f=typeof this.options.cancel=="string"?c(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){b.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=
+this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}this._mouseMoveDelegate=function(d){return b._mouseMove(d)};this._mouseUpDelegate=function(d){return b._mouseUp(d)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return a.originalEvent.mouseHandled=true}},_mouseMove:function(a){if(c.browser.msie&&!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);
+return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&c.data(a.target,this.widgetName+".preventClickEvent",
+true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
+;/*
+ * jQuery UI Position 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
+left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
+k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=
+m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
+d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
+a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
+g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
+;/*
+ * jQuery UI Draggable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
+"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
+this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-
+this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();
+d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||
+this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&
+this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==
+a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||
+0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],
+this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-
+(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment==
+"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[(a.containment=="document"?0:d(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(a.containment=="document"?0:d(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?
+0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),
+10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==
+Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():
+f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;
+if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])e=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/
+b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;e=this.originalPageX+Math.round((e-this.originalPageX)/b.grid[0])*b.grid[0];e=this.containment?!(e-this.offset.click.left<this.containment[0]||e-this.offset.click.left>this.containment[2])?e:!(e-this.offset.click.left<this.containment[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:g-this.offset.click.top-
+this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=
+this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.10"});
+d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var g=d.data(this,"sortable");if(g&&!g.options.disabled){c.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=
+0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=
+c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,
+true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=
+0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=
+a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","iframeFix",{start:function(){var a=d(this).data("draggable").options;d(a.iframeFix===true?"iframe":a.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},
+stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=
+document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-
+c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-b.overflowOffset.left<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-
+(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable",
+"snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,g=b.offset.left,n=g+c.helperProportions.width,m=b.offset.top,o=m+c.helperProportions.height,h=
+c.snapElements.length-1;h>=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e<g&&g<k+e&&j-e<m&&m<l+e||i-e<g&&g<k+e&&j-e<o&&o<l+e||i-e<n&&n<k+e&&j-e<m&&m<l+e||i-e<n&&n<k+e&&j-e<o&&o<l+e){if(f.snapMode!="inner"){var p=Math.abs(j-o)<=e,q=Math.abs(l-m)<=e,r=Math.abs(i-n)<=e,s=Math.abs(k-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",
+{top:l,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k}).left-c.margins.left}var t=p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(j-m)<=e;q=Math.abs(l-o)<=e;r=Math.abs(i-g)<=e;s=Math.abs(k-n)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:j,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:l-c.helperProportions.height,
+left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:i}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:k-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[h].snapping&&(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=p||q||r||s||t}else{c.snapElements[h].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,
+a,d.extend(c._uiHash(),{snapItem:c.snapElements[h].item}));c.snapElements[h].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,
+b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
+;/*
+ * jQuery UI Droppable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.mouse.js
+ * jquery.ui.draggable.js
+ */
+(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this);
+a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
+d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.10"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
+switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
+i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
+"none";if(c[f].visible){c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight};e=="mousedown"&&c[f]._activate.call(c[f],b)}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
+a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=
+d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})}}})(jQuery);
+;/*
+ * jQuery UI Resizable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
+top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
+String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};
+if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),
+d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=
+this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:
+this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",
+b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;
+f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");
+this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=
+null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=l(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=l(b.width)&&a.minWidth&&a.minWidth>b.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+
+this.size.height,k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=
+[c.css("borderTopWidth"),c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=
+this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,
+a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,
+c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,
+originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.10"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=
+b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width",
+"height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};
+if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-
+g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,
+height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=
+e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,
+d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?
+d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=
+a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&
+/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");
+b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/
+(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
+;/*
+ * jQuery UI Selectable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",
+c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d=
+this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
+a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
+!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
+e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.10"})})(jQuery);
+;/*
+ * jQuery UI Sortable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable");
+this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,
+arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=
+c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,
+{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();
+if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",
+a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");
+if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+
+this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+
+b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+
+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,
+c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==
+document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-
+1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});
+this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&
+a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?
+"width":"height"]>a[this.floating?"width":"height"]?j:g<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?
+c&&c=="right"||a=="down"?2:1:a&&(a=="down"?2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;
+return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=
+d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});
+return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=
+d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&this.helper)this.offset.parent=
+this._getParentOffset();for(var b=this.items.length-1;b>=0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=
+e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];
+if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);
+c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===
+1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=
+this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):
+b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==
+""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=
+this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),
+10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions=
+{width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||
+document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,
+b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=
+document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():
+e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-
+this.offset.click.left<this.containment[0])f=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<
+this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&
+this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=
+this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem[0].parentNode&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();
+this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],
+this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",
+g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||
+this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,
+originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.10"})})(jQuery);
+;/*
+ * jQuery UI Accordion 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");
+a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",
+function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a=this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+
+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("tabIndex");
+this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();
+b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target);
+a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+
+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options;
+if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);
+if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(),
+e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight||
+e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",
+tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.10",animations:{slide:function(a,b){a=
+c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);f[i]={value:j[1],
+unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",paddingTop:"hide",
+paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
+;/*
+ * jQuery UI Autocomplete 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.position.js
+ */
+(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.attr("readonly"))){g=false;var f=d.ui.keyCode;
+switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=a.element.val()){a.selectedItem=
+null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||
+"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&&a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),
+i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");
+this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source===
+"string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},
+_search:function(a){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==
+this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position))},
+_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var g=this;d.each(b,function(c,f){g._renderItem(a,f)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);
+else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery);
+(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.attr("scrollTop"),c=this.element.height();if(b<0)this.element.attr("scrollTop",g+b);else b>=c&&this.element.attr("scrollTop",g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},
+deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);
+e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,
+g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));
+this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element.attr("scrollHeight")},select:function(e){this._trigger("selected",e,{item:this.active})}})})(jQuery);
+;/*
+ * jQuery UI Button 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function(a){var g,i=function(b){a(":ui-button",b.target.form).each(function(){var c=a(this).data("button");setTimeout(function(){c.refresh()},1)})},h=function(b){var c=b.name,d=b.form,f=a([]);if(c)f=d?a(d).find("[name='"+c+"']"):a("[name='"+c+"']",b.ownerDocument).filter(function(){return!this.form});return f};a.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",
+i);if(typeof this.options.disabled!=="boolean")this.options.disabled=this.element.attr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var b=this,c=this.options,d=this.type==="checkbox"||this.type==="radio",f="ui-state-hover"+(!d?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",
+function(){if(!c.disabled){a(this).addClass("ui-state-hover");this===g&&a(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||a(this).removeClass(f)}).bind("focus.button",function(){a(this).addClass("ui-state-focus")}).bind("blur.button",function(){a(this).removeClass("ui-state-focus")});d&&this.element.bind("change.button",function(){b.refresh()});if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).toggleClass("ui-state-active");
+b.buttonElement.attr("aria-pressed",b.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");b.buttonElement.attr("aria-pressed",true);var e=b.element[0];h(e).not(e).map(function(){return a(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed",false)});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;a(this).addClass("ui-state-active");
+g=this;a(document).one("mouseup",function(){g=null})}).bind("mouseup.button",function(){if(c.disabled)return false;a(this).removeClass("ui-state-active")}).bind("keydown.button",function(e){if(c.disabled)return false;if(e.keyCode==a.ui.keyCode.SPACE||e.keyCode==a.ui.keyCode.ENTER)a(this).addClass("ui-state-active")}).bind("keyup.button",function(){a(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===a.ui.keyCode.SPACE&&a(this).click()})}this._setOption("disabled",
+c.disabled)},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type==="radio"){this.buttonElement=this.element.parents().last().find("label[for="+this.element.attr("id")+"]");this.element.addClass("ui-helper-hidden-accessible");var b=this.element.is(":checked");b&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",b)}else this.buttonElement=
+this.element},widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle||
+this.buttonElement.removeAttr("title");a.Widget.prototype.destroy.call(this)},_setOption:function(b,c){a.Widget.prototype._setOption.apply(this,arguments);if(b==="disabled")c?this.element.attr("disabled",true):this.element.removeAttr("disabled");this._resetButton()},refresh:function(){var b=this.element.is(":disabled");b!==this.options.disabled&&this._setOption("disabled",b);if(this.type==="radio")h(this.element[0]).each(function(){a(this).is(":checked")?a(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+true):a(this).button("widget").removeClass("ui-state-active").attr("aria-pressed",false)});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed",true):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed",false)},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var b=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
+c=a("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("<span class='ui-button-icon-primary ui-icon "+d.primary+"'></span>");d.secondary&&b.append("<span class='ui-button-icon-secondary ui-icon "+d.secondary+"'></span>");if(!this.options.text){e.push(f?"ui-button-icons-only":"ui-button-icon-only");
+b.removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,
+arguments)},refresh:function(){this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");
+a.Widget.prototype.destroy.call(this)}})})(jQuery);
+;/*
+ * jQuery UI Dialog 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.button.js
+ * jquery.ui.draggable.js
+ * jquery.ui.mouse.js
+ * jquery.ui.position.js
+ * jquery.ui.resizable.js
+ */
+(function(c,j){var k={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},l={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&
+c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",
+-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role",
+"button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=
+b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&&
+a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0]){e=c(this).css("z-index");
+isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);
+d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===f[0]&&e.shiftKey){g.focus(1);return false}}});
+c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(f,
+h){h=c.isFunction(h)?{click:h,text:f}:h;f=c('<button type="button"></button>').attr(h,true).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&f.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=
+d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize,
+position:f.position,size:f.size}}a=a===j?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f,
+h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===
+1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);if(g in k)e=true;if(g in
+l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled");
+break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e=
+this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&&
+this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.10",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===
+0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),
+height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
+b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,
+function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
+;/*
+ * jQuery UI Slider 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var b=this,a=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");a.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");
+this.range=d([]);if(a.range){if(a.range===true){this.range=d("<div></div>");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");
+if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length<a.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur();
+else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e=
+false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h===
+b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");
+this._mouseDestroy();return this},_mouseCapture:function(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b,
+g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true},
+_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a;
+if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=
+this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c<e))c=e;if(c!==this.values(a)){e=this.values();e[a]=c;b=this._trigger("slide",b,{handle:this.handles[a],value:c,values:e});this.values(a?0:1);b!==false&&this.values(a,c,true)}}else if(c!==this.value()){b=this._trigger("slide",b,{handle:this.handles[a],
+value:c});b!==false&&this.value(c)}},_stop:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("stop",b,c)},_change:function(b,a){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("change",b,c)}},value:function(b){if(arguments.length){this.options.value=
+this._trimAlignValue(b);this._refreshValue();this._change(null,0)}return this._value()},values:function(b,a){var c,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(b):this.value();
+else return this._values()},_setOption:function(b,a){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(b){case "disabled":if(a){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
+this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var b=this.options.value;return b=this._trimAlignValue(b)},_values:function(b){var a,c;if(arguments.length){a=this.options.values[b];
+return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<=this._valueMin())return this._valueMin();if(b>=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
+_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate);
+if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1,
+1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.10"})})(jQuery);
+;/*
+ * jQuery UI Tabs 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading…</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=
+d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
+(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+
+g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};
+this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=
+-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=
+d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b,
+e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);
+j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();
+if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null,
+this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
+load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
+"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.10"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
+a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
+;/*
+ * jQuery UI Datepicker 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ * jquery.ui.core.js
+ */
+(function(d,G){function K(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}function E(a,b){d.extend(a,b);for(var c in b)if(b[c]==
+null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.10"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();
+f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')}},
+_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&
+b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==
+""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,
+c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),
+true);this._updateDatepicker(b);this._updateAlternate(b);b.dpDiv.show()}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});
+b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);
+this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",
+this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,
+function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:
+f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?d.extend({},
+e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&this._hideDatepicker();var h=this._getDateDatepicker(a,true);E(e.settings,f);this._attachments(d(a),e);this._autoSize(e);this._setDateDatepicker(a,h);this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);
+this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]?
+d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]):d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||
+a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,
+e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,
+"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==G?a.keyCode:a.charCode);return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},
+_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=
+d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,
+c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&
+d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",
+function(){d(this).removeClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=
+-1&&d(this).addClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,
+"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),
+parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,
+b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);
+this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},
+_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):
+0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=
+false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b=this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=
+d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);
+else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=
+a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,
+g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=z+1<a.length&&a.charAt(z+1)==p)&&z++;return p},m=function(p){var v=o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&v?4:p=="o"?3:2)+"}");p=b.substring(s).match(p);if(!p)throw"Missing number at position "+s;s+=p[0].length;return parseInt(p[0],10)},n=function(p,v,H){p=o(p)?H:v;for(v=0;v<p.length;v++)if(b.substr(s,p[v].length).toLowerCase()==p[v].toLowerCase()){s+=p[v].length;return v+1}throw"Unknown name at position "+
+s;},r=function(){if(b.charAt(s)!=a.charAt(z))throw"Unexpected literal at position "+s;s++},s=0,z=0;z<a.length;z++)if(k)if(a.charAt(z)=="'"&&!o("'"))k=false;else r();else switch(a.charAt(z)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var w=new Date(m("@"));c=w.getFullYear();j=w.getMonth()+1;l=w.getDate();break;case "!":w=new Date((m("!")-this._ticksTo1970)/1E4);c=w.getFullYear();j=w.getMonth()+
+1;l=w.getDate();break;case "'":if(o("'"))r();else k=true;break;default:r()}if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}w=this._daylightSavingAdjust(new Date(c,j-1,l));if(w.getFullYear()!=c||w.getMonth()+1!=j||w.getDate()!=l)throw"Invalid date";return w},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",
+RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&
+a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,r){return i(o)?r[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break;case "o":l+=g("o",(b.getTime()-(new Date(b.getFullYear(),0,0)).getTime())/864E5,3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",
+b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+=
+"0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==G?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=
+f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=
+(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,
+l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=
+a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),
+b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=
+this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+r+'"><span class="ui-icon ui-icon-circle-triangle-'+
+(c?"w":"e")+'">'+r+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+r+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+r+"</span></a>";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,r,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+y+'.datepicker._hideDatepicker();">'+this._get(a,
+"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,r)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+y+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=
+this._get(a,"monthNames"),w=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),v=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",C=0;C<i[0];C++){for(var M="",D=0;D<i[1];D++){var N=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",x="";if(l){x+='<div class="ui-datepicker-group';if(i[1]>1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-
+1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&C==0?c?f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,C>0||D>0,z,w)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var A=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var q=
+(t+h)%7;A+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+r[q]+'">'+s[q]+"</span></th>"}x+=A+"</tr></thead><tbody>";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O<A;O++){x+="<tr>";var P=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(q)+"</td>";for(t=0;t<7;t++){var F=
+p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,J=B&&!H||!F[0]||k&&q<k||o&&q>o;P+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(B?" ui-datepicker-other-month":"")+(q.getTime()==N.getTime()&&g==a.selectedMonth&&a._keyEvent||L.getTime()==q.getTime()&&L.getTime()==N.getTime()?" "+this._dayOverClass:"")+(J?" "+this._unselectableClass+" ui-state-disabled":"")+(B&&!v?"":" "+F[1]+(q.getTime()==u.getTime()?" "+this._currentClass:"")+(q.getTime()==b.getTime()?" ui-datepicker-today":
+""))+'"'+((!B||v)&&F[2]?' title="'+F[2]+'"':"")+(J?"":' onclick="DP_jQuery_'+y+".datepicker._selectDay('#"+a.id+"',"+q.getMonth()+","+q.getFullYear()+', this);return false;"')+">"+(B&&!v?" ":J?'<span class="ui-state-default">'+q.getDate()+"</span>":'<a class="ui-state-default'+(q.getTime()==b.getTime()?" ui-state-highlight":"")+(q.getTime()==u.getTime()?" ui-state-active":"")+(B?" ui-priority-secondary":"")+'" href="#">'+q.getDate()+"</a>")+"</td>";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=
+P+"</tr>"}g++;if(g>11){g=0;m++}x+="</tbody></table>"+(l?"</div>"+(i[0]>0&&D==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");M+=x}I+=M}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',
+o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&
+l)?" ":""));a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+y+".datepicker._selectMonthYear('#"+
+a.id+"', this, 'Y');\" onclick=\"DP_jQuery_"+y+".datepicker._clickMonthYear('#"+a.id+"');\">";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";if(d.browser.mozilla)k+='<select class="ui-datepicker-year"><option value="'+c+'" selected="selected">'+c+"</option></select>";else{k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=
+a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,
+"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);
+c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,
+"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=
+function(a){if(!this.length)return this;if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,
+[this[0]].concat(b));return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.10";window["DP_jQuery_"+y]=d})(jQuery);
+;/*
+ * jQuery UI Progressbar 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
+this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*
+this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.10"})})(jQuery);
+;/*
+ * jQuery UI Effects 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects||function(f,j){function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
+16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return o.transparent;return o[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return n(b)}function p(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
+a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var o={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
+0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
+211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},r=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
+d){if(f.isFunction(b)){d=b;b=null}return this.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments)});h=f.queue(this);l=h.splice(h.length-1,1)[0];
+h.splice(1,0,l);f.dequeue(this)})};f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,
+a):f.effects.animateClass.apply(this,[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.10",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,
+a){var b;switch(c[0]){case "top":b=0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",
+border:"none",margin:0,padding:0});c.wrap(b);b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(d,e){a[e]=c.css(e);if(isNaN(parseInt(a[e],10)))a[e]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent().replaceWith(c);
+return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(c))return this._show.apply(this,arguments);
+else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(m(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(m(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),
+b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,
+a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,
+a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==
+e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=
+g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/
+h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,
+a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
+;/*
+ * jQuery UI Effects Blind 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,
+g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Bounce 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","bottom","left","right"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
+3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
+b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Clip 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,
+c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Drop 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e==
+"show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Explode 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
+0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
+e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
+;/*
+ * jQuery UI Effects Fade 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Fold 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],
+10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
+;/*
+ * jQuery UI Effects Highlight 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
+this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Pulsate 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
+a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Scale 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
+b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
+1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],g=["position","top","bottom","left","right","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
+p=c.effects.setMode(a,b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};
+if(m=="box"||m=="both"){if(d.from.y!=d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);
+a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);
+child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,
+n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Shake 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=
+(h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
+;/*
+ * jQuery UI Effects Slide 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);
+var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
+;/*
+ * jQuery UI Effects Transfer 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
+b.dequeue()})})}})(jQuery);
+;
\ No newline at end of file
--- /dev/null
+/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Written by Renier Pretorius. */
+jQuery(function($){
+ $.datepicker.regional['af'] = {
+ closeText: 'Selekteer',
+ prevText: 'Vorige',
+ nextText: 'Volgende',
+ currentText: 'Vandag',
+ monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
+ 'Julie','Augustus','September','Oktober','November','Desember'],
+ monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
+ dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
+ dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
+ dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['af']);
+});
+/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/
+/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
+
+jQuery(function($){
+ $.datepicker.regional['ar-DZ'] = {
+ closeText: 'إغلاق',
+ prevText: '<السابق',
+ nextText: 'التالي>',
+ currentText: 'اليوم',
+ monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان',
+ 'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'],
+ monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ weekHeader: 'أسبوع',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 6,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ar-DZ']);
+});
+/* Arabic Translation for jQuery UI date picker plugin. */
+/* Khaled Alhourani -- me@khaledalhourani.com */
+/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */
+jQuery(function($){
+ $.datepicker.regional['ar'] = {
+ closeText: 'إغلاق',
+ prevText: '<السابق',
+ nextText: 'التالي>',
+ currentText: 'اليوم',
+ monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران',
+ 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
+ monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ weekHeader: 'أسبوع',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 6,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ar']);
+});/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Jamil Najafov (necefov33@gmail.com). */
+jQuery(function($) {
+ $.datepicker.regional['az'] = {
+ closeText: 'Bağla',
+ prevText: '<Geri',
+ nextText: 'İrəli>',
+ currentText: 'Bugün',
+ monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
+ 'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
+ monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun',
+ 'İyul','Avq','Sen','Okt','Noy','Dek'],
+ dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
+ dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
+ dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
+ weekHeader: 'Hf',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['az']);
+});/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Stoyan Kyosev (http://svest.org). */
+jQuery(function($){
+ $.datepicker.regional['bg'] = {
+ closeText: 'затвори',
+ prevText: '<назад',
+ nextText: 'напред>',
+ nextBigText: '>>',
+ currentText: 'днес',
+ monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
+ 'Юли','Август','Септември','Октомври','Ноември','Декември'],
+ monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
+ 'Юли','Авг','Сеп','Окт','Нов','Дек'],
+ dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
+ dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
+ dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['bg']);
+});
+/* Bosnian i18n for the jQuery UI date picker plugin. */
+/* Written by Kenan Konjo. */
+jQuery(function($){
+ $.datepicker.regional['bs'] = {
+ closeText: 'Zatvori',
+ prevText: '<',
+ nextText: '>',
+ currentText: 'Danas',
+ monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
+ 'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+ dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+ dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['bs']);
+});/* Inicialització en català per a l'extenció 'calendar' per jQuery. */
+/* Writers: (joan.leon@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ca'] = {
+ closeText: 'Tancar',
+ prevText: '<Ant',
+ nextText: 'Seg>',
+ currentText: 'Avui',
+ monthNames: ['Gener','Febrer','Març','Abril','Maig','Juny',
+ 'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
+ monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
+ 'Jul','Ago','Set','Oct','Nov','Des'],
+ dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
+ dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
+ dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ca']);
+});/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Written by Tomas Muller (tomas@tomas-muller.net). */
+jQuery(function($){
+ $.datepicker.regional['cs'] = {
+ closeText: 'Zavřít',
+ prevText: '<Dříve',
+ nextText: 'Později>',
+ currentText: 'Nyní',
+ monthNames: ['leden','únor','březen','duben','květen','červen',
+ 'červenec','srpen','září','říjen','listopad','prosinec'],
+ monthNamesShort: ['led','úno','bře','dub','kvě','čer',
+ 'čvc','srp','zář','říj','lis','pro'],
+ dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
+ dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
+ dayNamesMin: ['ne','po','út','st','čt','pá','so'],
+ weekHeader: 'Týd',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['cs']);
+});
+/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jan Christensen ( deletestuff@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['da'] = {
+ closeText: 'Luk',
+ prevText: '<Forrige',
+ nextText: 'Næste>',
+ currentText: 'Idag',
+ monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+ 'Juli','August','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
+ dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
+ dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
+ weekHeader: 'Uge',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['da']);
+});
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+ $.datepicker.regional['de'] = {
+ closeText: 'schließen',
+ prevText: '<zurück',
+ nextText: 'Vor>',
+ currentText: 'heute',
+ monthNames: ['Januar','Februar','März','April','Mai','Juni',
+ 'Juli','August','September','Oktober','November','Dezember'],
+ monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dez'],
+ dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+ dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+ dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+ weekHeader: 'Wo',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['de']);
+});
+/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Written by Alex Cicovic (http://www.alexcicovic.com) */
+jQuery(function($){
+ $.datepicker.regional['el'] = {
+ closeText: 'Κλείσιμο',
+ prevText: 'Προηγούμενος',
+ nextText: 'Επόμενος',
+ currentText: 'Τρέχων Μήνας',
+ monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος',
+ 'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'],
+ monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν',
+ 'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'],
+ dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'],
+ dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'],
+ dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'],
+ weekHeader: 'Εβδ',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['el']);
+});/* English/Australia initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+ $.datepicker.regional['en-AU'] = {
+ closeText: 'Done',
+ prevText: 'Prev',
+ nextText: 'Next',
+ currentText: 'Today',
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'],
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['en-AU']);
+});
+/* English/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by Stuart. */
+jQuery(function($){
+ $.datepicker.regional['en-GB'] = {
+ closeText: 'Done',
+ prevText: 'Prev',
+ nextText: 'Next',
+ currentText: 'Today',
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'],
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['en-GB']);
+});
+/* English/New Zealand initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+ $.datepicker.regional['en-NZ'] = {
+ closeText: 'Done',
+ prevText: 'Prev',
+ nextText: 'Next',
+ currentText: 'Today',
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'],
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['en-NZ']);
+});
+/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Written by Olivier M. (olivierweb@ifrance.com). */
+jQuery(function($){
+ $.datepicker.regional['eo'] = {
+ closeText: 'Fermi',
+ prevText: '<Anta',
+ nextText: 'Sekv>',
+ currentText: 'Nuna',
+ monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
+ 'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aŭg','Sep','Okt','Nov','Dec'],
+ dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
+ dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'],
+ dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'],
+ weekHeader: 'Sb',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['eo']);
+});
+/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['es'] = {
+ closeText: 'Cerrar',
+ prevText: '<Ant',
+ nextText: 'Sig>',
+ currentText: 'Hoy',
+ monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
+ 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
+ monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
+ 'Jul','Ago','Sep','Oct','Nov','Dic'],
+ dayNames: ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'],
+ dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'],
+ dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','Sá'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['es']);
+});/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
+jQuery(function($){
+ $.datepicker.regional['et'] = {
+ closeText: 'Sulge',
+ prevText: 'Eelnev',
+ nextText: 'Järgnev',
+ currentText: 'Täna',
+ monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni',
+ 'Juuli','August','September','Oktoober','November','Detsember'],
+ monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
+ 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
+ dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
+ dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
+ dayNamesMin: ['P','E','T','K','N','R','L'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['et']);
+}); /* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
+/* Karrikas-ek itzulia (karrikas@karrikas.com) */
+jQuery(function($){
+ $.datepicker.regional['eu'] = {
+ closeText: 'Egina',
+ prevText: '<Aur',
+ nextText: 'Hur>',
+ currentText: 'Gaur',
+ monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina',
+ 'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'],
+ monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka',
+ 'Uzt','Abu','Ira','Urr','Aza','Abe'],
+ dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'],
+ dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'],
+ dayNamesMin: ['Ig','As','As','As','Os','Os','La'],
+ weekHeader: 'Wk',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['eu']);
+});/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Javad Mowlanezhad -- jmowla@gmail.com */
+/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
+jQuery(function($) {
+ $.datepicker.regional['fa'] = {
+ closeText: 'بستن',
+ prevText: '<قبلي',
+ nextText: 'بعدي>',
+ currentText: 'امروز',
+ monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور',
+ 'مهر','آبان','آذر','دي','بهمن','اسفند'],
+ monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+ dayNames: ['يکشنبه','دوشنبه','سهشنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'],
+ dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'],
+ dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'],
+ weekHeader: 'هف',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 6,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fa']);
+});/* Finnish initialisation for the jQuery UI date picker plugin. */
+/* Written by Harri Kilpi� (harrikilpio@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['fi'] = {
+ closeText: 'Sulje',
+ prevText: '«Edellinen',
+ nextText: 'Seuraava»',
+ currentText: 'Tänään',
+ monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu',
+ 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+ monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä',
+ 'Heinä','Elo','Syys','Loka','Marras','Joulu'],
+ dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'],
+ dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
+ dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
+ weekHeader: 'Vk',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fi']);
+});
+/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
+jQuery(function($){
+ $.datepicker.regional['fo'] = {
+ closeText: 'Lat aftur',
+ prevText: '<Fyrra',
+ nextText: 'Næsta>',
+ currentText: 'Í dag',
+ monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
+ 'Juli','August','September','Oktober','November','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Des'],
+ dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'],
+ dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'],
+ dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
+ weekHeader: 'Vk',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fo']);
+});
+/* Swiss-French initialisation for the jQuery UI date picker plugin. */
+/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
+jQuery(function($){
+ $.datepicker.regional['fr-CH'] = {
+ closeText: 'Fermer',
+ prevText: '<Préc',
+ nextText: 'Suiv>',
+ currentText: 'Courant',
+ monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+ 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+ monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+ 'Jul','Aoû','Sep','Oct','Nov','Déc'],
+ dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+ dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+ dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fr-CH']);
+});/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au),
+ Stéphane Nahmani (sholby@sholby.net),
+ Stéphane Raimbault <stephane.raimbault@gmail.com> */
+jQuery(function($){
+ $.datepicker.regional['fr'] = {
+ closeText: 'Fermer',
+ prevText: 'Précédent',
+ nextText: 'Suivant',
+ currentText: 'Aujourd\'hui',
+ monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+ 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+ monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin',
+ 'Juil.','Août','Sept.','Oct.','Nov.','Déc.'],
+ dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+ dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'],
+ dayNamesMin: ['D','L','M','M','J','V','S'],
+ weekHeader: 'Sem.',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fr']);
+});
+/* Galician localization for 'UI date picker' jQuery extension. */
+/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
+jQuery(function($){
+ $.datepicker.regional['gl'] = {
+ closeText: 'Pechar',
+ prevText: '<Ant',
+ nextText: 'Seg>',
+ currentText: 'Hoxe',
+ monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
+ 'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
+ monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
+ 'Xul','Ago','Set','Out','Nov','Dec'],
+ dayNames: ['Domingo','Luns','Martes','Mércores','Xoves','Venres','Sábado'],
+ dayNamesShort: ['Dom','Lun','Mar','Mér','Xov','Ven','Sáb'],
+ dayNamesMin: ['Do','Lu','Ma','Mé','Xo','Ve','Sá'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['gl']);
+});/* Hebrew initialisation for the UI Datepicker extension. */
+/* Written by Amir Hardon (ahardon at gmail dot com). */
+jQuery(function($){
+ $.datepicker.regional['he'] = {
+ closeText: 'סגור',
+ prevText: '<הקודם',
+ nextText: 'הבא>',
+ currentText: 'היום',
+ monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
+ 'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
+ monthNamesShort: ['1','2','3','4','5','6',
+ '7','8','9','10','11','12'],
+ dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
+ dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+ dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['he']);
+});
+/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Written by Vjekoslav Nesek. */
+jQuery(function($){
+ $.datepicker.regional['hr'] = {
+ closeText: 'Zatvori',
+ prevText: '<',
+ nextText: '>',
+ currentText: 'Danas',
+ monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
+ 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
+ monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip',
+ 'Srp','Kol','Ruj','Lis','Stu','Pro'],
+ dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+ dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+ dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+ weekHeader: 'Tje',
+ dateFormat: 'dd.mm.yy.',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hr']);
+});/* Hungarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
+jQuery(function($){
+ $.datepicker.regional['hu'] = {
+ closeText: 'bezárás',
+ prevText: '« vissza',
+ nextText: 'előre »',
+ currentText: 'ma',
+ monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június',
+ 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
+ monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún',
+ 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
+ dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
+ dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
+ dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+ weekHeader: 'Hé',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hu']);
+});
+/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
+jQuery(function($){
+ $.datepicker.regional['hy'] = {
+ closeText: 'Փակել',
+ prevText: '<Նախ.',
+ nextText: 'Հաջ.>',
+ currentText: 'Այսօր',
+ monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս',
+ 'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'],
+ monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս',
+ 'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'],
+ dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'],
+ dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+ dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+ weekHeader: 'ՇԲՏ',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hy']);
+});/* Indonesian initialisation for the jQuery UI date picker plugin. */
+/* Written by Deden Fathurahman (dedenf@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['id'] = {
+ closeText: 'Tutup',
+ prevText: '<mundur',
+ nextText: 'maju>',
+ currentText: 'hari ini',
+ monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
+ 'Juli','Agustus','September','Oktober','Nopember','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+ 'Jul','Agus','Sep','Okt','Nop','Des'],
+ dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
+ dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
+ dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
+ weekHeader: 'Mg',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['id']);
+});/* Icelandic initialisation for the jQuery UI date picker plugin. */
+/* Written by Haukur H. Thorsson (haukur@eskill.is). */
+jQuery(function($){
+ $.datepicker.regional['is'] = {
+ closeText: 'Loka',
+ prevText: '< Fyrri',
+ nextText: 'Næsti >',
+ currentText: 'Í dag',
+ monthNames: ['Janúar','Febrúar','Mars','Apríl','Maí','Júní',
+ 'Júlí','Ágúst','September','Október','Nóvember','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maí','Jún',
+ 'Júl','Ágú','Sep','Okt','Nóv','Des'],
+ dayNames: ['Sunnudagur','Mánudagur','Þriðjudagur','Miðvikudagur','Fimmtudagur','Föstudagur','Laugardagur'],
+ dayNamesShort: ['Sun','Mán','Þri','Mið','Fim','Fös','Lau'],
+ dayNamesMin: ['Su','Má','Þr','Mi','Fi','Fö','La'],
+ weekHeader: 'Vika',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['is']);
+});/* Italian initialisation for the jQuery UI date picker plugin. */
+/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['it'] = {
+ closeText: 'Chiudi',
+ prevText: '<Prec',
+ nextText: 'Succ>',
+ currentText: 'Oggi',
+ monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
+ 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
+ monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
+ 'Lug','Ago','Set','Ott','Nov','Dic'],
+ dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'],
+ dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
+ dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['it']);
+});
+/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Written by Kentaro SATO (kentaro@ranvis.com). */
+jQuery(function($){
+ $.datepicker.regional['ja'] = {
+ closeText: '閉じる',
+ prevText: '<前',
+ nextText: '次>',
+ currentText: '今日',
+ monthNames: ['1月','2月','3月','4月','5月','6月',
+ '7月','8月','9月','10月','11月','12月'],
+ monthNamesShort: ['1月','2月','3月','4月','5月','6月',
+ '7月','8月','9月','10月','11月','12月'],
+ dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
+ dayNamesShort: ['日','月','火','水','木','金','土'],
+ dayNamesMin: ['日','月','火','水','木','金','土'],
+ weekHeader: '週',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '年'};
+ $.datepicker.setDefaults($.datepicker.regional['ja']);
+});/* Korean initialisation for the jQuery calendar extension. */
+/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ko'] = {
+ closeText: '닫기',
+ prevText: '이전달',
+ nextText: '다음달',
+ currentText: '오늘',
+ monthNames: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
+ '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
+ monthNamesShort: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
+ '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
+ dayNames: ['일','월','화','수','목','금','토'],
+ dayNamesShort: ['일','월','화','수','목','금','토'],
+ dayNamesMin: ['일','월','화','수','목','금','토'],
+ weekHeader: 'Wk',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: '년'};
+ $.datepicker.setDefaults($.datepicker.regional['ko']);
+});/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['kz'] = {
+ closeText: 'Жабу',
+ prevText: '<Алдыңғы',
+ nextText: 'Келесі>',
+ currentText: 'Бүгін',
+ monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
+ 'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
+ monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау',
+ 'Шіл','Там','Қыр','Қаз','Қар','Жел'],
+ dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'],
+ dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'],
+ dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'],
+ weekHeader: 'Не',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['kz']);
+});
+/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas@avalon.lt> */
+jQuery(function($){
+ $.datepicker.regional['lt'] = {
+ closeText: 'Uždaryti',
+ prevText: '<Atgal',
+ nextText: 'Pirmyn>',
+ currentText: 'Šiandien',
+ monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
+ 'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
+ monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
+ 'Lie','Rugp','Rugs','Spa','Lap','Gru'],
+ dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'],
+ dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'],
+ dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'],
+ weekHeader: 'Wk',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['lt']);
+});/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
+jQuery(function($){
+ $.datepicker.regional['lv'] = {
+ closeText: 'Aizvērt',
+ prevText: 'Iepr',
+ nextText: 'Nāka',
+ currentText: 'Šodien',
+ monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs',
+ 'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn',
+ 'Jūl','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'],
+ dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
+ dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
+ weekHeader: 'Nav',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['lv']);
+});/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Saji Nediyanchath (saji89@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ml'] = {
+ closeText: 'ശരി',
+ prevText: 'മുന്നത്തെ',
+ nextText: 'അടുത്തത് ',
+ currentText: 'ഇന്ന്',
+ monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്ച്ച്','ഏപ്രില്','മേയ്','ജൂണ്',
+ 'ജൂലൈ','ആഗസ്റ്റ്','സെപ്റ്റംബര്','ഒക്ടോബര്','നവംബര്','ഡിസംബര്'],
+ monthNamesShort: ['ജനു', 'ഫെബ്', 'മാര്', 'ഏപ്രി', 'മേയ്', 'ജൂണ്',
+ 'ജൂലാ', 'ആഗ', 'സെപ്', 'ഒക്ടോ', 'നവം', 'ഡിസ'],
+ dayNames: ['ഞായര്', 'തിങ്കള്', 'ചൊവ്വ', 'ബുധന്', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+ dayNamesShort: ['ഞായ', 'തിങ്ക', 'ചൊവ്വ', 'ബുധ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+ dayNamesMin: ['ഞാ','തി','ചൊ','ബു','വ്യാ','വെ','ശ'],
+ weekHeader: 'ആ',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ml']);
+});
+/* Malaysian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
+jQuery(function($){
+ $.datepicker.regional['ms'] = {
+ closeText: 'Tutup',
+ prevText: '<Sebelum',
+ nextText: 'Selepas>',
+ currentText: 'hari ini',
+ monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
+ 'Julai','Ogos','September','Oktober','November','Disember'],
+ monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
+ 'Jul','Ogo','Sep','Okt','Nov','Dis'],
+ dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
+ dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
+ dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
+ weekHeader: 'Mg',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ms']);
+});/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Mathias Bynens <http://mathiasbynens.be/> */
+jQuery(function($){
+ $.datepicker.regional.nl = {
+ closeText: 'Sluiten',
+ prevText: '←',
+ nextText: '→',
+ currentText: 'Vandaag',
+ monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+ 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+ monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun',
+ 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+ dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+ dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+ dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional.nl);
+});/* Norwegian initialisation for the jQuery UI date picker plugin. */
+/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+
+jQuery(function($){
+ $.datepicker.regional['no'] = {
+ closeText: 'Lukk',
+ prevText: '«Forrige',
+ nextText: 'Neste»',
+ currentText: 'I dag',
+ monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
+ monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
+ dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
+ dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
+ dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
+ weekHeader: 'Uke',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''
+ };
+ $.datepicker.setDefaults($.datepicker.regional['no']);
+});
+/* Polish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['pl'] = {
+ closeText: 'Zamknij',
+ prevText: '<Poprzedni',
+ nextText: 'Następny>',
+ currentText: 'Dziś',
+ monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
+ 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
+ monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
+ 'Lip','Sie','Wrz','Pa','Lis','Gru'],
+ dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
+ dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'],
+ dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'],
+ weekHeader: 'Tydz',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pl']);
+});
+/* Brazilian initialisation for the jQuery UI date picker plugin. */
+/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['pt-BR'] = {
+ closeText: 'Fechar',
+ prevText: '<Anterior',
+ nextText: 'Próximo>',
+ currentText: 'Hoje',
+ monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
+ 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+ monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+ 'Jul','Ago','Set','Out','Nov','Dez'],
+ dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
+ dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pt-BR']);
+});/* Portuguese initialisation for the jQuery UI date picker plugin. */
+jQuery(function($){
+ $.datepicker.regional['pt'] = {
+ closeText: 'Fechar',
+ prevText: '<Anterior',
+ nextText: 'Seguinte',
+ currentText: 'Hoje',
+ monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
+ 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+ monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+ 'Jul','Ago','Set','Out','Nov','Dez'],
+ dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
+ dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ weekHeader: 'Sem',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pt']);
+});/* Romansh initialisation for the jQuery UI date picker plugin. */
+/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
+jQuery(function($){
+ $.datepicker.regional['rm'] = {
+ closeText: 'Serrar',
+ prevText: '<Suandant',
+ nextText: 'Precedent>',
+ currentText: 'Actual',
+ monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
+ monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
+ dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'],
+ dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'],
+ dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'],
+ weekHeader: 'emna',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['rm']);
+});
+/* Romanian initialisation for the jQuery UI date picker plugin.
+ *
+ * Written by Edmond L. (ll_edmond@walla.com)
+ * and Ionut G. Stan (ionut.g.stan@gmail.com)
+ */
+jQuery(function($){
+ $.datepicker.regional['ro'] = {
+ closeText: 'Închide',
+ prevText: '« Luna precedentă',
+ nextText: 'Luna următoare »',
+ currentText: 'Azi',
+ monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
+ 'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
+ monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
+ 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
+ dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
+ dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'],
+ weekHeader: 'Săpt',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ro']);
+});
+/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Andrew Stromnov (stromnov@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ru'] = {
+ closeText: 'Закрыть',
+ prevText: '<Пред',
+ nextText: 'След>',
+ currentText: 'Сегодня',
+ monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
+ 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
+ monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
+ 'Июл','Авг','Сен','Окт','Ноя','Дек'],
+ dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
+ dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
+ dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
+ weekHeader: 'Нед',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ru']);
+});/* Slovak initialisation for the jQuery UI date picker plugin. */
+/* Written by Vojtech Rinik (vojto@hmm.sk). */
+jQuery(function($){
+ $.datepicker.regional['sk'] = {
+ closeText: 'Zavrieť',
+ prevText: '<Predchádzajúci',
+ nextText: 'Nasledujúci>',
+ currentText: 'Dnes',
+ monthNames: ['Január','Február','Marec','Apríl','Máj','Jún',
+ 'Júl','August','September','Október','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
+ 'Júl','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedel\'a','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'],
+ dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'],
+ dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'],
+ weekHeader: 'Ty',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sk']);
+});
+/* Slovenian initialisation for the jQuery UI date picker plugin. */
+/* Written by Jaka Jancar (jaka@kubje.org). */
+/* c = č, s = š z = ž C = Č S = Š Z = Ž */
+jQuery(function($){
+ $.datepicker.regional['sl'] = {
+ closeText: 'Zapri',
+ prevText: '<Prejšnji',
+ nextText: 'Naslednji>',
+ currentText: 'Trenutni',
+ monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
+ 'Julij','Avgust','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Avg','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','Četrtek','Petek','Sobota'],
+ dayNamesShort: ['Ned','Pon','Tor','Sre','Čet','Pet','Sob'],
+ dayNamesMin: ['Ne','Po','To','Sr','Če','Pe','So'],
+ weekHeader: 'Teden',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sl']);
+});
+/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Written by Flakron Bytyqi (flakron@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['sq'] = {
+ closeText: 'mbylle',
+ prevText: '<mbrapa',
+ nextText: 'Përpara>',
+ currentText: 'sot',
+ monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
+ 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
+ monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
+ 'Kor','Gus','Sht','Tet','Nën','Dhj'],
+ dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'],
+ dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+ dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+ weekHeader: 'Ja',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sq']);
+});
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+ $.datepicker.regional['sr-SR'] = {
+ closeText: 'Zatvori',
+ prevText: '<',
+ nextText: '>',
+ currentText: 'Danas',
+ monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
+ 'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Avg','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Četvrtak','Petak','Subota'],
+ dayNamesShort: ['Ned','Pon','Uto','Sre','Čet','Pet','Sub'],
+ dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+ weekHeader: 'Sed',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sr-SR']);
+});
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+ $.datepicker.regional['sr'] = {
+ closeText: 'Затвори',
+ prevText: '<',
+ nextText: '>',
+ currentText: 'Данас',
+ monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
+ 'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
+ monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун',
+ 'Јул','Авг','Сеп','Окт','Нов','Дец'],
+ dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'],
+ dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'],
+ dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'],
+ weekHeader: 'Сед',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sr']);
+});
+/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Written by Anders Ekdahl ( anders@nomadiz.se). */
+jQuery(function($){
+ $.datepicker.regional['sv'] = {
+ closeText: 'Stäng',
+ prevText: '«Förra',
+ nextText: 'Nästa»',
+ currentText: 'Idag',
+ monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+ 'Juli','Augusti','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dec'],
+ dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
+ dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
+ dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
+ weekHeader: 'Ve',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sv']);
+});
+/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by S A Sureshkumar (saskumar@live.com). */
+jQuery(function($){
+ $.datepicker.regional['ta'] = {
+ closeText: 'மூடு',
+ prevText: 'முன்னையது',
+ nextText: 'அடுத்தது',
+ currentText: 'இன்று',
+ monthNames: ['தை','மாசி','பங்குனி','சித்திரை','வைகாசி','ஆனி',
+ 'ஆடி','ஆவணி','புரட்டாசி','ஐப்பசி','கார்த்திகை','மார்கழி'],
+ monthNamesShort: ['தை','மாசி','பங்','சித்','வைகா','ஆனி',
+ 'ஆடி','ஆவ','புர','ஐப்','கார்','மார்'],
+ dayNames: ['ஞாயிற்றுக்கிழமை','திங்கட்கிழமை','செவ்வாய்க்கிழமை','புதன்கிழமை','வியாழக்கிழமை','வெள்ளிக்கிழமை','சனிக்கிழமை'],
+ dayNamesShort: ['ஞாயிறு','திங்கள்','செவ்வாய்','புதன்','வியாழன்','வெள்ளி','சனி'],
+ dayNamesMin: ['ஞா','தி','செ','பு','வி','வெ','ச'],
+ weekHeader: 'Не',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ta']);
+});
+/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Written by pipo (pipo@sixhead.com). */
+jQuery(function($){
+ $.datepicker.regional['th'] = {
+ closeText: 'ปิด',
+ prevText: '« ย้อน',
+ nextText: 'ถัดไป »',
+ currentText: 'วันนี้',
+ monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
+ 'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
+ monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
+ 'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'],
+ dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'],
+ dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+ dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['th']);
+});/* Turkish initialisation for the jQuery UI date picker plugin. */
+/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
+jQuery(function($){
+ $.datepicker.regional['tr'] = {
+ closeText: 'kapat',
+ prevText: '<geri',
+ nextText: 'ileri>',
+ currentText: 'bugün',
+ monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
+ 'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'],
+ monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz',
+ 'Tem','Ağu','Eyl','Eki','Kas','Ara'],
+ dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'],
+ dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+ dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+ weekHeader: 'Hf',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['tr']);
+});/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['uk'] = {
+ closeText: 'Закрити',
+ prevText: '<',
+ nextText: '>',
+ currentText: 'Сьогодні',
+ monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
+ 'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
+ monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер',
+ 'Лип','Сер','Вер','Жов','Лис','Гру'],
+ dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'],
+ dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'],
+ dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'],
+ weekHeader: 'Не',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['uk']);
+});/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
+jQuery(function($){
+ $.datepicker.regional['vi'] = {
+ closeText: 'Đóng',
+ prevText: '<Trước',
+ nextText: 'Tiếp>',
+ currentText: 'Hôm nay',
+ monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
+ 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
+ monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
+ 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
+ dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
+ dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+ dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+ weekHeader: 'Tu',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['vi']);
+});
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Cloudream (cloudream@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['zh-CN'] = {
+ closeText: '关闭',
+ prevText: '<上月',
+ nextText: '下月>',
+ currentText: '今天',
+ monthNames: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','九月','十月','十一月','十二月'],
+ monthNamesShort: ['一','二','三','四','五','六',
+ '七','八','九','十','十一','十二'],
+ dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+ dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+ dayNamesMin: ['日','一','二','三','四','五','六'],
+ weekHeader: '周',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '年'};
+ $.datepicker.setDefaults($.datepicker.regional['zh-CN']);
+});
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by SCCY (samuelcychan@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['zh-HK'] = {
+ closeText: '關閉',
+ prevText: '<上月',
+ nextText: '下月>',
+ currentText: '今天',
+ monthNames: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','九月','十月','十一月','十二月'],
+ monthNamesShort: ['一','二','三','四','五','六',
+ '七','八','九','十','十一','十二'],
+ dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+ dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+ dayNamesMin: ['日','一','二','三','四','五','六'],
+ weekHeader: '周',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '年'};
+ $.datepicker.setDefaults($.datepicker.regional['zh-HK']);
+});
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Ressol (ressol@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['zh-TW'] = {
+ closeText: '關閉',
+ prevText: '<上月',
+ nextText: '下月>',
+ currentText: '今天',
+ monthNames: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','九月','十月','十一月','十二月'],
+ monthNamesShort: ['一','二','三','四','五','六',
+ '七','八','九','十','十一','十二'],
+ dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+ dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+ dayNamesMin: ['日','一','二','三','四','五','六'],
+ weekHeader: '周',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '年'};
+ $.datepicker.setDefaults($.datepicker.regional['zh-TW']);
+});
--- /dev/null
+/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Written by Renier Pretorius. */
+jQuery(function($){
+ $.datepicker.regional['af'] = {
+ closeText: 'Selekteer',
+ prevText: 'Vorige',
+ nextText: 'Volgende',
+ currentText: 'Vandag',
+ monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
+ 'Julie','Augustus','September','Oktober','November','Desember'],
+ monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
+ dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
+ dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
+ dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['af']);
+});
--- /dev/null
+/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/
+/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
+
+jQuery(function($){
+ $.datepicker.regional['ar-DZ'] = {
+ closeText: 'إغلاق',
+ prevText: '<السابق',
+ nextText: 'التالي>',
+ currentText: 'اليوم',
+ monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان',
+ 'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'],
+ monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ weekHeader: 'أسبوع',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 6,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ar-DZ']);
+});
--- /dev/null
+/* Arabic Translation for jQuery UI date picker plugin. */
+/* Khaled Alhourani -- me@khaledalhourani.com */
+/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */
+jQuery(function($){
+ $.datepicker.regional['ar'] = {
+ closeText: 'إغلاق',
+ prevText: '<السابق',
+ nextText: 'التالي>',
+ currentText: 'اليوم',
+ monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'آذار', 'حزيران',
+ 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
+ monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+ dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+ weekHeader: 'أسبوع',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 6,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ar']);
+});
\ No newline at end of file
--- /dev/null
+/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Jamil Najafov (necefov33@gmail.com). */
+jQuery(function($) {
+ $.datepicker.regional['az'] = {
+ closeText: 'Bağla',
+ prevText: '<Geri',
+ nextText: 'İrəli>',
+ currentText: 'Bugün',
+ monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
+ 'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
+ monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun',
+ 'İyul','Avq','Sen','Okt','Noy','Dek'],
+ dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
+ dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
+ dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
+ weekHeader: 'Hf',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['az']);
+});
\ No newline at end of file
--- /dev/null
+/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Stoyan Kyosev (http://svest.org). */
+jQuery(function($){
+ $.datepicker.regional['bg'] = {
+ closeText: 'затвори',
+ prevText: '<назад',
+ nextText: 'напред>',
+ nextBigText: '>>',
+ currentText: 'днес',
+ monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
+ 'Юли','Август','Септември','Октомври','Ноември','Декември'],
+ monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
+ 'Юли','Авг','Сеп','Окт','Нов','Дек'],
+ dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
+ dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
+ dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['bg']);
+});
--- /dev/null
+/* Bosnian i18n for the jQuery UI date picker plugin. */
+/* Written by Kenan Konjo. */
+jQuery(function($){
+ $.datepicker.regional['bs'] = {
+ closeText: 'Zatvori',
+ prevText: '<',
+ nextText: '>',
+ currentText: 'Danas',
+ monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
+ 'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+ dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+ dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['bs']);
+});
\ No newline at end of file
--- /dev/null
+/* Inicialització en català per a l'extenció 'calendar' per jQuery. */
+/* Writers: (joan.leon@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ca'] = {
+ closeText: 'Tancar',
+ prevText: '<Ant',
+ nextText: 'Seg>',
+ currentText: 'Avui',
+ monthNames: ['Gener','Febrer','Març','Abril','Maig','Juny',
+ 'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
+ monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
+ 'Jul','Ago','Set','Oct','Nov','Des'],
+ dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
+ dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
+ dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ca']);
+});
\ No newline at end of file
--- /dev/null
+/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Written by Tomas Muller (tomas@tomas-muller.net). */
+jQuery(function($){
+ $.datepicker.regional['cs'] = {
+ closeText: 'Zavřít',
+ prevText: '<Dříve',
+ nextText: 'Později>',
+ currentText: 'Nyní',
+ monthNames: ['leden','únor','březen','duben','květen','červen',
+ 'červenec','srpen','září','říjen','listopad','prosinec'],
+ monthNamesShort: ['led','úno','bře','dub','kvě','čer',
+ 'čvc','srp','zář','říj','lis','pro'],
+ dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
+ dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
+ dayNamesMin: ['ne','po','út','st','čt','pá','so'],
+ weekHeader: 'Týd',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['cs']);
+});
--- /dev/null
+/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jan Christensen ( deletestuff@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['da'] = {
+ closeText: 'Luk',
+ prevText: '<Forrige',
+ nextText: 'Næste>',
+ currentText: 'Idag',
+ monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+ 'Juli','August','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
+ dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
+ dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
+ weekHeader: 'Uge',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['da']);
+});
--- /dev/null
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+ $.datepicker.regional['de'] = {
+ closeText: 'schließen',
+ prevText: '<zurück',
+ nextText: 'Vor>',
+ currentText: 'heute',
+ monthNames: ['Januar','Februar','März','April','Mai','Juni',
+ 'Juli','August','September','Oktober','November','Dezember'],
+ monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dez'],
+ dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+ dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+ dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+ weekHeader: 'Wo',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['de']);
+});
--- /dev/null
+/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Written by Alex Cicovic (http://www.alexcicovic.com) */
+jQuery(function($){
+ $.datepicker.regional['el'] = {
+ closeText: 'Κλείσιμο',
+ prevText: 'Προηγούμενος',
+ nextText: 'Επόμενος',
+ currentText: 'Τρέχων Μήνας',
+ monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος',
+ 'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'],
+ monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν',
+ 'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'],
+ dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'],
+ dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'],
+ dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'],
+ weekHeader: 'Εβδ',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['el']);
+});
\ No newline at end of file
--- /dev/null
+/* English/Australia initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+ $.datepicker.regional['en-AU'] = {
+ closeText: 'Done',
+ prevText: 'Prev',
+ nextText: 'Next',
+ currentText: 'Today',
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'],
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['en-AU']);
+});
--- /dev/null
+/* English/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by Stuart. */
+jQuery(function($){
+ $.datepicker.regional['en-GB'] = {
+ closeText: 'Done',
+ prevText: 'Prev',
+ nextText: 'Next',
+ currentText: 'Today',
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'],
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['en-GB']);
+});
--- /dev/null
+/* English/New Zealand initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+ $.datepicker.regional['en-NZ'] = {
+ closeText: 'Done',
+ prevText: 'Prev',
+ nextText: 'Next',
+ currentText: 'Today',
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'],
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['en-NZ']);
+});
--- /dev/null
+/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Written by Olivier M. (olivierweb@ifrance.com). */
+jQuery(function($){
+ $.datepicker.regional['eo'] = {
+ closeText: 'Fermi',
+ prevText: '<Anta',
+ nextText: 'Sekv>',
+ currentText: 'Nuna',
+ monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
+ 'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aŭg','Sep','Okt','Nov','Dec'],
+ dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
+ dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'],
+ dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'],
+ weekHeader: 'Sb',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['eo']);
+});
--- /dev/null
+/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['es'] = {
+ closeText: 'Cerrar',
+ prevText: '<Ant',
+ nextText: 'Sig>',
+ currentText: 'Hoy',
+ monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
+ 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
+ monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
+ 'Jul','Ago','Sep','Oct','Nov','Dic'],
+ dayNames: ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'],
+ dayNamesShort: ['Dom','Lun','Mar','Mié','Juv','Vie','Sáb'],
+ dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','Sá'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['es']);
+});
\ No newline at end of file
--- /dev/null
+/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
+jQuery(function($){
+ $.datepicker.regional['et'] = {
+ closeText: 'Sulge',
+ prevText: 'Eelnev',
+ nextText: 'Järgnev',
+ currentText: 'Täna',
+ monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni',
+ 'Juuli','August','September','Oktoober','November','Detsember'],
+ monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
+ 'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
+ dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
+ dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
+ dayNamesMin: ['P','E','T','K','N','R','L'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['et']);
+});
\ No newline at end of file
--- /dev/null
+/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
+/* Karrikas-ek itzulia (karrikas@karrikas.com) */
+jQuery(function($){
+ $.datepicker.regional['eu'] = {
+ closeText: 'Egina',
+ prevText: '<Aur',
+ nextText: 'Hur>',
+ currentText: 'Gaur',
+ monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina',
+ 'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'],
+ monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka',
+ 'Uzt','Abu','Ira','Urr','Aza','Abe'],
+ dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'],
+ dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'],
+ dayNamesMin: ['Ig','As','As','As','Os','Os','La'],
+ weekHeader: 'Wk',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['eu']);
+});
\ No newline at end of file
--- /dev/null
+/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Javad Mowlanezhad -- jmowla@gmail.com */
+/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
+jQuery(function($) {
+ $.datepicker.regional['fa'] = {
+ closeText: 'بستن',
+ prevText: '<قبلي',
+ nextText: 'بعدي>',
+ currentText: 'امروز',
+ monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور',
+ 'مهر','آبان','آذر','دي','بهمن','اسفند'],
+ monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+ dayNames: ['يکشنبه','دوشنبه','سهشنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'],
+ dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'],
+ dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'],
+ weekHeader: 'هف',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 6,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fa']);
+});
\ No newline at end of file
--- /dev/null
+/* Finnish initialisation for the jQuery UI date picker plugin. */
+/* Written by Harri Kilpi� (harrikilpio@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['fi'] = {
+ closeText: 'Sulje',
+ prevText: '«Edellinen',
+ nextText: 'Seuraava»',
+ currentText: 'Tänään',
+ monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kesäkuu',
+ 'Heinäkuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+ monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kesä',
+ 'Heinä','Elo','Syys','Loka','Marras','Joulu'],
+ dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'],
+ dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
+ dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
+ weekHeader: 'Vk',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fi']);
+});
--- /dev/null
+/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
+jQuery(function($){
+ $.datepicker.regional['fo'] = {
+ closeText: 'Lat aftur',
+ prevText: '<Fyrra',
+ nextText: 'Næsta>',
+ currentText: 'Í dag',
+ monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
+ 'Juli','August','September','Oktober','November','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Des'],
+ dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'],
+ dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'],
+ dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
+ weekHeader: 'Vk',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fo']);
+});
--- /dev/null
+/* Swiss-French initialisation for the jQuery UI date picker plugin. */
+/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
+jQuery(function($){
+ $.datepicker.regional['fr-CH'] = {
+ closeText: 'Fermer',
+ prevText: '<Préc',
+ nextText: 'Suiv>',
+ currentText: 'Courant',
+ monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+ 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+ monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+ 'Jul','Aoû','Sep','Oct','Nov','Déc'],
+ dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+ dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+ dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fr-CH']);
+});
\ No newline at end of file
--- /dev/null
+/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au),
+ Stéphane Nahmani (sholby@sholby.net),
+ Stéphane Raimbault <stephane.raimbault@gmail.com> */
+jQuery(function($){
+ $.datepicker.regional['fr'] = {
+ closeText: 'Fermer',
+ prevText: 'Précédent',
+ nextText: 'Suivant',
+ currentText: 'Aujourd\'hui',
+ monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+ 'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+ monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin',
+ 'Juil.','Août','Sept.','Oct.','Nov.','Déc.'],
+ dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+ dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'],
+ dayNamesMin: ['D','L','M','M','J','V','S'],
+ weekHeader: 'Sem.',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['fr']);
+});
--- /dev/null
+/* Galician localization for 'UI date picker' jQuery extension. */
+/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
+jQuery(function($){
+ $.datepicker.regional['gl'] = {
+ closeText: 'Pechar',
+ prevText: '<Ant',
+ nextText: 'Seg>',
+ currentText: 'Hoxe',
+ monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
+ 'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
+ monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
+ 'Xul','Ago','Set','Out','Nov','Dec'],
+ dayNames: ['Domingo','Luns','Martes','Mércores','Xoves','Venres','Sábado'],
+ dayNamesShort: ['Dom','Lun','Mar','Mér','Xov','Ven','Sáb'],
+ dayNamesMin: ['Do','Lu','Ma','Mé','Xo','Ve','Sá'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['gl']);
+});
\ No newline at end of file
--- /dev/null
+/* Hebrew initialisation for the UI Datepicker extension. */
+/* Written by Amir Hardon (ahardon at gmail dot com). */
+jQuery(function($){
+ $.datepicker.regional['he'] = {
+ closeText: 'סגור',
+ prevText: '<הקודם',
+ nextText: 'הבא>',
+ currentText: 'היום',
+ monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
+ 'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
+ monthNamesShort: ['1','2','3','4','5','6',
+ '7','8','9','10','11','12'],
+ dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
+ dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+ dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: true,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['he']);
+});
--- /dev/null
+/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Written by Vjekoslav Nesek. */
+jQuery(function($){
+ $.datepicker.regional['hr'] = {
+ closeText: 'Zatvori',
+ prevText: '<',
+ nextText: '>',
+ currentText: 'Danas',
+ monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
+ 'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
+ monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip',
+ 'Srp','Kol','Ruj','Lis','Stu','Pro'],
+ dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+ dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+ dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+ weekHeader: 'Tje',
+ dateFormat: 'dd.mm.yy.',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hr']);
+});
\ No newline at end of file
--- /dev/null
+/* Hungarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
+jQuery(function($){
+ $.datepicker.regional['hu'] = {
+ closeText: 'bezárás',
+ prevText: '« vissza',
+ nextText: 'előre »',
+ currentText: 'ma',
+ monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június',
+ 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
+ monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún',
+ 'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
+ dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
+ dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
+ dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+ weekHeader: 'Hé',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hu']);
+});
--- /dev/null
+/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
+jQuery(function($){
+ $.datepicker.regional['hy'] = {
+ closeText: 'Փակել',
+ prevText: '<Նախ.',
+ nextText: 'Հաջ.>',
+ currentText: 'Այսօր',
+ monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս',
+ 'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'],
+ monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս',
+ 'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'],
+ dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'],
+ dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+ dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+ weekHeader: 'ՇԲՏ',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['hy']);
+});
\ No newline at end of file
--- /dev/null
+/* Indonesian initialisation for the jQuery UI date picker plugin. */
+/* Written by Deden Fathurahman (dedenf@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['id'] = {
+ closeText: 'Tutup',
+ prevText: '<mundur',
+ nextText: 'maju>',
+ currentText: 'hari ini',
+ monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
+ 'Juli','Agustus','September','Oktober','Nopember','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+ 'Jul','Agus','Sep','Okt','Nop','Des'],
+ dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
+ dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
+ dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
+ weekHeader: 'Mg',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['id']);
+});
\ No newline at end of file
--- /dev/null
+/* Icelandic initialisation for the jQuery UI date picker plugin. */
+/* Written by Haukur H. Thorsson (haukur@eskill.is). */
+jQuery(function($){
+ $.datepicker.regional['is'] = {
+ closeText: 'Loka',
+ prevText: '< Fyrri',
+ nextText: 'Næsti >',
+ currentText: 'Í dag',
+ monthNames: ['Janúar','Febrúar','Mars','Apríl','Maí','Júní',
+ 'Júlí','Ágúst','September','Október','Nóvember','Desember'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maí','Jún',
+ 'Júl','Ágú','Sep','Okt','Nóv','Des'],
+ dayNames: ['Sunnudagur','Mánudagur','Þriðjudagur','Miðvikudagur','Fimmtudagur','Föstudagur','Laugardagur'],
+ dayNamesShort: ['Sun','Mán','Þri','Mið','Fim','Fös','Lau'],
+ dayNamesMin: ['Su','Má','Þr','Mi','Fi','Fö','La'],
+ weekHeader: 'Vika',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['is']);
+});
\ No newline at end of file
--- /dev/null
+/* Italian initialisation for the jQuery UI date picker plugin. */
+/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['it'] = {
+ closeText: 'Chiudi',
+ prevText: '<Prec',
+ nextText: 'Succ>',
+ currentText: 'Oggi',
+ monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
+ 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
+ monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
+ 'Lug','Ago','Set','Ott','Nov','Dic'],
+ dayNames: ['Domenica','Lunedì','Martedì','Mercoledì','Giovedì','Venerdì','Sabato'],
+ dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
+ dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['it']);
+});
--- /dev/null
+/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Written by Kentaro SATO (kentaro@ranvis.com). */
+jQuery(function($){
+ $.datepicker.regional['ja'] = {
+ closeText: '閉じる',
+ prevText: '<前',
+ nextText: '次>',
+ currentText: '今日',
+ monthNames: ['1月','2月','3月','4月','5月','6月',
+ '7月','8月','9月','10月','11月','12月'],
+ monthNamesShort: ['1月','2月','3月','4月','5月','6月',
+ '7月','8月','9月','10月','11月','12月'],
+ dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
+ dayNamesShort: ['日','月','火','水','木','金','土'],
+ dayNamesMin: ['日','月','火','水','木','金','土'],
+ weekHeader: '週',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '年'};
+ $.datepicker.setDefaults($.datepicker.regional['ja']);
+});
\ No newline at end of file
--- /dev/null
+/* Korean initialisation for the jQuery calendar extension. */
+/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ko'] = {
+ closeText: '닫기',
+ prevText: '이전달',
+ nextText: '다음달',
+ currentText: '오늘',
+ monthNames: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
+ '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
+ monthNamesShort: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
+ '7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
+ dayNames: ['일','월','화','수','목','금','토'],
+ dayNamesShort: ['일','월','화','수','목','금','토'],
+ dayNamesMin: ['일','월','화','수','목','금','토'],
+ weekHeader: 'Wk',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: '년'};
+ $.datepicker.setDefaults($.datepicker.regional['ko']);
+});
\ No newline at end of file
--- /dev/null
+/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['kz'] = {
+ closeText: 'Жабу',
+ prevText: '<Алдыңғы',
+ nextText: 'Келесі>',
+ currentText: 'Бүгін',
+ monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
+ 'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
+ monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау',
+ 'Шіл','Там','Қыр','Қаз','Қар','Жел'],
+ dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'],
+ dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'],
+ dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'],
+ weekHeader: 'Не',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['kz']);
+});
--- /dev/null
+/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas@avalon.lt> */
+jQuery(function($){
+ $.datepicker.regional['lt'] = {
+ closeText: 'Uždaryti',
+ prevText: '<Atgal',
+ nextText: 'Pirmyn>',
+ currentText: 'Šiandien',
+ monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
+ 'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
+ monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
+ 'Lie','Rugp','Rugs','Spa','Lap','Gru'],
+ dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'],
+ dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'],
+ dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'],
+ weekHeader: 'Wk',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['lt']);
+});
\ No newline at end of file
--- /dev/null
+/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
+jQuery(function($){
+ $.datepicker.regional['lv'] = {
+ closeText: 'Aizvērt',
+ prevText: 'Iepr',
+ nextText: 'Nāka',
+ currentText: 'Šodien',
+ monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs',
+ 'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn',
+ 'Jūl','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'],
+ dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
+ dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
+ weekHeader: 'Nav',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['lv']);
+});
\ No newline at end of file
--- /dev/null
+/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Saji Nediyanchath (saji89@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ml'] = {
+ closeText: 'ശരി',
+ prevText: 'മുന്നത്തെ',
+ nextText: 'അടുത്തത് ',
+ currentText: 'ഇന്ന്',
+ monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്ച്ച്','ഏപ്രില്','മേയ്','ജൂണ്',
+ 'ജൂലൈ','ആഗസ്റ്റ്','സെപ്റ്റംബര്','ഒക്ടോബര്','നവംബര്','ഡിസംബര്'],
+ monthNamesShort: ['ജനു', 'ഫെബ്', 'മാര്', 'ഏപ്രി', 'മേയ്', 'ജൂണ്',
+ 'ജൂലാ', 'ആഗ', 'സെപ്', 'ഒക്ടോ', 'നവം', 'ഡിസ'],
+ dayNames: ['ഞായര്', 'തിങ്കള്', 'ചൊവ്വ', 'ബുധന്', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+ dayNamesShort: ['ഞായ', 'തിങ്ക', 'ചൊവ്വ', 'ബുധ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+ dayNamesMin: ['ഞാ','തി','ചൊ','ബു','വ്യാ','വെ','ശ'],
+ weekHeader: 'ആ',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ml']);
+});
--- /dev/null
+/* Malaysian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
+jQuery(function($){
+ $.datepicker.regional['ms'] = {
+ closeText: 'Tutup',
+ prevText: '<Sebelum',
+ nextText: 'Selepas>',
+ currentText: 'hari ini',
+ monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
+ 'Julai','Ogos','September','Oktober','November','Disember'],
+ monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
+ 'Jul','Ogo','Sep','Okt','Nov','Dis'],
+ dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
+ dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
+ dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
+ weekHeader: 'Mg',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ms']);
+});
\ No newline at end of file
--- /dev/null
+/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Mathias Bynens <http://mathiasbynens.be/> */
+jQuery(function($){
+ $.datepicker.regional.nl = {
+ closeText: 'Sluiten',
+ prevText: '←',
+ nextText: '→',
+ currentText: 'Vandaag',
+ monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+ 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+ monthNamesShort: ['jan', 'feb', 'maa', 'apr', 'mei', 'jun',
+ 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+ dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+ dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+ dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional.nl);
+});
\ No newline at end of file
--- /dev/null
+/* Norwegian initialisation for the jQuery UI date picker plugin. */
+/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+
+jQuery(function($){
+ $.datepicker.regional['no'] = {
+ closeText: 'Lukk',
+ prevText: '«Forrige',
+ nextText: 'Neste»',
+ currentText: 'I dag',
+ monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
+ monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
+ dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
+ dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
+ dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
+ weekHeader: 'Uke',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''
+ };
+ $.datepicker.setDefaults($.datepicker.regional['no']);
+});
--- /dev/null
+/* Polish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['pl'] = {
+ closeText: 'Zamknij',
+ prevText: '<Poprzedni',
+ nextText: 'Następny>',
+ currentText: 'Dziś',
+ monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
+ 'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
+ monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
+ 'Lip','Sie','Wrz','Pa','Lis','Gru'],
+ dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
+ dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'],
+ dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'],
+ weekHeader: 'Tydz',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pl']);
+});
--- /dev/null
+/* Brazilian initialisation for the jQuery UI date picker plugin. */
+/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['pt-BR'] = {
+ closeText: 'Fechar',
+ prevText: '<Anterior',
+ nextText: 'Próximo>',
+ currentText: 'Hoje',
+ monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
+ 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+ monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+ 'Jul','Ago','Set','Out','Nov','Dez'],
+ dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
+ dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ weekHeader: 'Sm',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pt-BR']);
+});
\ No newline at end of file
--- /dev/null
+/* Portuguese initialisation for the jQuery UI date picker plugin. */
+jQuery(function($){
+ $.datepicker.regional['pt'] = {
+ closeText: 'Fechar',
+ prevText: '<Anterior',
+ nextText: 'Seguinte',
+ currentText: 'Hoje',
+ monthNames: ['Janeiro','Fevereiro','Março','Abril','Maio','Junho',
+ 'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+ monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+ 'Jul','Ago','Set','Out','Nov','Dez'],
+ dayNames: ['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
+ dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'],
+ weekHeader: 'Sem',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['pt']);
+});
\ No newline at end of file
--- /dev/null
+/* Romansh initialisation for the jQuery UI date picker plugin. */
+/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
+jQuery(function($){
+ $.datepicker.regional['rm'] = {
+ closeText: 'Serrar',
+ prevText: '<Suandant',
+ nextText: 'Precedent>',
+ currentText: 'Actual',
+ monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
+ monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
+ dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'],
+ dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'],
+ dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'],
+ weekHeader: 'emna',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['rm']);
+});
--- /dev/null
+/* Romanian initialisation for the jQuery UI date picker plugin.
+ *
+ * Written by Edmond L. (ll_edmond@walla.com)
+ * and Ionut G. Stan (ionut.g.stan@gmail.com)
+ */
+jQuery(function($){
+ $.datepicker.regional['ro'] = {
+ closeText: 'Închide',
+ prevText: '« Luna precedentă',
+ nextText: 'Luna următoare »',
+ currentText: 'Azi',
+ monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
+ 'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
+ monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
+ 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
+ dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
+ dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'],
+ weekHeader: 'Săpt',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ro']);
+});
--- /dev/null
+/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Andrew Stromnov (stromnov@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['ru'] = {
+ closeText: 'Закрыть',
+ prevText: '<Пред',
+ nextText: 'След>',
+ currentText: 'Сегодня',
+ monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
+ 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
+ monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
+ 'Июл','Авг','Сен','Окт','Ноя','Дек'],
+ dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
+ dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
+ dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
+ weekHeader: 'Нед',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ru']);
+});
\ No newline at end of file
--- /dev/null
+/* Slovak initialisation for the jQuery UI date picker plugin. */
+/* Written by Vojtech Rinik (vojto@hmm.sk). */
+jQuery(function($){
+ $.datepicker.regional['sk'] = {
+ closeText: 'Zavrieť',
+ prevText: '<Predchádzajúci',
+ nextText: 'Nasledujúci>',
+ currentText: 'Dnes',
+ monthNames: ['Január','Február','Marec','Apríl','Máj','Jún',
+ 'Júl','August','September','Október','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
+ 'Júl','Aug','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedel\'a','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'],
+ dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'],
+ dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'],
+ weekHeader: 'Ty',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sk']);
+});
--- /dev/null
+/* Slovenian initialisation for the jQuery UI date picker plugin. */
+/* Written by Jaka Jancar (jaka@kubje.org). */
+/* c = č, s = š z = ž C = Č S = Š Z = Ž */
+jQuery(function($){
+ $.datepicker.regional['sl'] = {
+ closeText: 'Zapri',
+ prevText: '<Prejšnji',
+ nextText: 'Naslednji>',
+ currentText: 'Trenutni',
+ monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
+ 'Julij','Avgust','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Avg','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','Četrtek','Petek','Sobota'],
+ dayNamesShort: ['Ned','Pon','Tor','Sre','Čet','Pet','Sob'],
+ dayNamesMin: ['Ne','Po','To','Sr','Če','Pe','So'],
+ weekHeader: 'Teden',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sl']);
+});
--- /dev/null
+/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Written by Flakron Bytyqi (flakron@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['sq'] = {
+ closeText: 'mbylle',
+ prevText: '<mbrapa',
+ nextText: 'Përpara>',
+ currentText: 'sot',
+ monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
+ 'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
+ monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
+ 'Kor','Gus','Sht','Tet','Nën','Dhj'],
+ dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'],
+ dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+ dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+ weekHeader: 'Ja',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sq']);
+});
--- /dev/null
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+ $.datepicker.regional['sr-SR'] = {
+ closeText: 'Zatvori',
+ prevText: '<',
+ nextText: '>',
+ currentText: 'Danas',
+ monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
+ 'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Avg','Sep','Okt','Nov','Dec'],
+ dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Četvrtak','Petak','Subota'],
+ dayNamesShort: ['Ned','Pon','Uto','Sre','Čet','Pet','Sub'],
+ dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+ weekHeader: 'Sed',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sr-SR']);
+});
--- /dev/null
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+ $.datepicker.regional['sr'] = {
+ closeText: 'Затвори',
+ prevText: '<',
+ nextText: '>',
+ currentText: 'Данас',
+ monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
+ 'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
+ monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун',
+ 'Јул','Авг','Сеп','Окт','Нов','Дец'],
+ dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'],
+ dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'],
+ dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'],
+ weekHeader: 'Сед',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sr']);
+});
--- /dev/null
+/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Written by Anders Ekdahl ( anders@nomadiz.se). */
+jQuery(function($){
+ $.datepicker.regional['sv'] = {
+ closeText: 'Stäng',
+ prevText: '«Förra',
+ nextText: 'Nästa»',
+ currentText: 'Idag',
+ monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+ 'Juli','Augusti','September','Oktober','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+ 'Jul','Aug','Sep','Okt','Nov','Dec'],
+ dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
+ dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
+ dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
+ weekHeader: 'Ve',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['sv']);
+});
--- /dev/null
+/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by S A Sureshkumar (saskumar@live.com). */
+jQuery(function($){
+ $.datepicker.regional['ta'] = {
+ closeText: 'மூடு',
+ prevText: 'முன்னையது',
+ nextText: 'அடுத்தது',
+ currentText: 'இன்று',
+ monthNames: ['தை','மாசி','பங்குனி','சித்திரை','வைகாசி','ஆனி',
+ 'ஆடி','ஆவணி','புரட்டாசி','ஐப்பசி','கார்த்திகை','மார்கழி'],
+ monthNamesShort: ['தை','மாசி','பங்','சித்','வைகா','ஆனி',
+ 'ஆடி','ஆவ','புர','ஐப்','கார்','மார்'],
+ dayNames: ['ஞாயிற்றுக்கிழமை','திங்கட்கிழமை','செவ்வாய்க்கிழமை','புதன்கிழமை','வியாழக்கிழமை','வெள்ளிக்கிழமை','சனிக்கிழமை'],
+ dayNamesShort: ['ஞாயிறு','திங்கள்','செவ்வாய்','புதன்','வியாழன்','வெள்ளி','சனி'],
+ dayNamesMin: ['ஞா','தி','செ','பு','வி','வெ','ச'],
+ weekHeader: 'Не',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['ta']);
+});
--- /dev/null
+/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Written by pipo (pipo@sixhead.com). */
+jQuery(function($){
+ $.datepicker.regional['th'] = {
+ closeText: 'ปิด',
+ prevText: '« ย้อน',
+ nextText: 'ถัดไป »',
+ currentText: 'วันนี้',
+ monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
+ 'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
+ monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
+ 'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'],
+ dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'],
+ dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+ dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+ weekHeader: 'Wk',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['th']);
+});
\ No newline at end of file
--- /dev/null
+/* Turkish initialisation for the jQuery UI date picker plugin. */
+/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
+jQuery(function($){
+ $.datepicker.regional['tr'] = {
+ closeText: 'kapat',
+ prevText: '<geri',
+ nextText: 'ileri>',
+ currentText: 'bugün',
+ monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
+ 'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'],
+ monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz',
+ 'Tem','Ağu','Eyl','Eki','Kas','Ara'],
+ dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'],
+ dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+ dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+ weekHeader: 'Hf',
+ dateFormat: 'dd.mm.yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['tr']);
+});
\ No newline at end of file
--- /dev/null
+/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['uk'] = {
+ closeText: 'Закрити',
+ prevText: '<',
+ nextText: '>',
+ currentText: 'Сьогодні',
+ monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
+ 'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
+ monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер',
+ 'Лип','Сер','Вер','Жов','Лис','Гру'],
+ dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'],
+ dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'],
+ dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'],
+ weekHeader: 'Не',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['uk']);
+});
\ No newline at end of file
--- /dev/null
+/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
+jQuery(function($){
+ $.datepicker.regional['vi'] = {
+ closeText: 'Đóng',
+ prevText: '<Trước',
+ nextText: 'Tiếp>',
+ currentText: 'Hôm nay',
+ monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
+ 'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
+ monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
+ 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
+ dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
+ dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+ dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+ weekHeader: 'Tu',
+ dateFormat: 'dd/mm/yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: false,
+ yearSuffix: ''};
+ $.datepicker.setDefaults($.datepicker.regional['vi']);
+});
--- /dev/null
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Cloudream (cloudream@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['zh-CN'] = {
+ closeText: '关闭',
+ prevText: '<上月',
+ nextText: '下月>',
+ currentText: '今天',
+ monthNames: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','九月','十月','十一月','十二月'],
+ monthNamesShort: ['一','二','三','四','五','六',
+ '七','八','九','十','十一','十二'],
+ dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+ dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+ dayNamesMin: ['日','一','二','三','四','五','六'],
+ weekHeader: '周',
+ dateFormat: 'yy-mm-dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '年'};
+ $.datepicker.setDefaults($.datepicker.regional['zh-CN']);
+});
--- /dev/null
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by SCCY (samuelcychan@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['zh-HK'] = {
+ closeText: '關閉',
+ prevText: '<上月',
+ nextText: '下月>',
+ currentText: '今天',
+ monthNames: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','九月','十月','十一月','十二月'],
+ monthNamesShort: ['一','二','三','四','五','六',
+ '七','八','九','十','十一','十二'],
+ dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+ dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+ dayNamesMin: ['日','一','二','三','四','五','六'],
+ weekHeader: '周',
+ dateFormat: 'dd-mm-yy',
+ firstDay: 0,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '年'};
+ $.datepicker.setDefaults($.datepicker.regional['zh-HK']);
+});
--- /dev/null
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Ressol (ressol@gmail.com). */
+jQuery(function($){
+ $.datepicker.regional['zh-TW'] = {
+ closeText: '關閉',
+ prevText: '<上月',
+ nextText: '下月>',
+ currentText: '今天',
+ monthNames: ['一月','二月','三月','四月','五月','六月',
+ '七月','八月','九月','十月','十一月','十二月'],
+ monthNamesShort: ['一','二','三','四','五','六',
+ '七','八','九','十','十一','十二'],
+ dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+ dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+ dayNamesMin: ['日','一','二','三','四','五','六'],
+ weekHeader: '周',
+ dateFormat: 'yy/mm/dd',
+ firstDay: 1,
+ isRTL: false,
+ showMonthAfterYear: true,
+ yearSuffix: '年'};
+ $.datepicker.setDefaults($.datepicker.regional['zh-TW']);
+});
--- /dev/null
+/*!
+ * jQuery UI 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function( $, undefined ) {
+
+// prevent duplicate loading
+// this is only a problem because we proxy existing functions
+// and we don't want to double proxy them
+$.ui = $.ui || {};
+if ( $.ui.version ) {
+ return;
+}
+
+$.extend( $.ui, {
+ version: "1.8.10",
+
+ keyCode: {
+ ALT: 18,
+ BACKSPACE: 8,
+ CAPS_LOCK: 20,
+ COMMA: 188,
+ COMMAND: 91,
+ COMMAND_LEFT: 91, // COMMAND
+ COMMAND_RIGHT: 93,
+ CONTROL: 17,
+ DELETE: 46,
+ DOWN: 40,
+ END: 35,
+ ENTER: 13,
+ ESCAPE: 27,
+ HOME: 36,
+ INSERT: 45,
+ LEFT: 37,
+ MENU: 93, // COMMAND_RIGHT
+ NUMPAD_ADD: 107,
+ NUMPAD_DECIMAL: 110,
+ NUMPAD_DIVIDE: 111,
+ NUMPAD_ENTER: 108,
+ NUMPAD_MULTIPLY: 106,
+ NUMPAD_SUBTRACT: 109,
+ PAGE_DOWN: 34,
+ PAGE_UP: 33,
+ PERIOD: 190,
+ RIGHT: 39,
+ SHIFT: 16,
+ SPACE: 32,
+ TAB: 9,
+ UP: 38,
+ WINDOWS: 91 // COMMAND
+ }
+});
+
+// plugins
+$.fn.extend({
+ _focus: $.fn.focus,
+ focus: function( delay, fn ) {
+ return typeof delay === "number" ?
+ this.each(function() {
+ var elem = this;
+ setTimeout(function() {
+ $( elem ).focus();
+ if ( fn ) {
+ fn.call( elem );
+ }
+ }, delay );
+ }) :
+ this._focus.apply( this, arguments );
+ },
+
+ scrollParent: function() {
+ var scrollParent;
+ if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+ scrollParent = this.parents().filter(function() {
+ return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+ }).eq(0);
+ } else {
+ scrollParent = this.parents().filter(function() {
+ return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+ }).eq(0);
+ }
+
+ return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
+ },
+
+ zIndex: function( zIndex ) {
+ if ( zIndex !== undefined ) {
+ return this.css( "zIndex", zIndex );
+ }
+
+ if ( this.length ) {
+ var elem = $( this[ 0 ] ), position, value;
+ while ( elem.length && elem[ 0 ] !== document ) {
+ // Ignore z-index if position is set to a value where z-index is ignored by the browser
+ // This makes behavior of this function consistent across browsers
+ // WebKit always returns auto if the element is positioned
+ position = elem.css( "position" );
+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+ // IE returns 0 when zIndex is not specified
+ // other browsers return a string
+ // we ignore the case of nested elements with an explicit value of 0
+ // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+ value = parseInt( elem.css( "zIndex" ), 10 );
+ if ( !isNaN( value ) && value !== 0 ) {
+ return value;
+ }
+ }
+ elem = elem.parent();
+ }
+ }
+
+ return 0;
+ },
+
+ disableSelection: function() {
+ return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+ ".ui-disableSelection", function( event ) {
+ event.preventDefault();
+ });
+ },
+
+ enableSelection: function() {
+ return this.unbind( ".ui-disableSelection" );
+ }
+});
+
+$.each( [ "Width", "Height" ], function( i, name ) {
+ var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+ type = name.toLowerCase(),
+ orig = {
+ innerWidth: $.fn.innerWidth,
+ innerHeight: $.fn.innerHeight,
+ outerWidth: $.fn.outerWidth,
+ outerHeight: $.fn.outerHeight
+ };
+
+ function reduce( elem, size, border, margin ) {
+ $.each( side, function() {
+ size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
+ if ( border ) {
+ size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
+ }
+ if ( margin ) {
+ size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
+ }
+ });
+ return size;
+ }
+
+ $.fn[ "inner" + name ] = function( size ) {
+ if ( size === undefined ) {
+ return orig[ "inner" + name ].call( this );
+ }
+
+ return this.each(function() {
+ $( this ).css( type, reduce( this, size ) + "px" );
+ });
+ };
+
+ $.fn[ "outer" + name] = function( size, margin ) {
+ if ( typeof size !== "number" ) {
+ return orig[ "outer" + name ].call( this, size );
+ }
+
+ return this.each(function() {
+ $( this).css( type, reduce( this, size, true, margin ) + "px" );
+ });
+ };
+});
+
+// selectors
+function visible( element ) {
+ return !$( element ).parents().andSelf().filter(function() {
+ return $.curCSS( this, "visibility" ) === "hidden" ||
+ $.expr.filters.hidden( this );
+ }).length;
+}
+
+$.extend( $.expr[ ":" ], {
+ data: function( elem, i, match ) {
+ return !!$.data( elem, match[ 3 ] );
+ },
+
+ focusable: function( element ) {
+ var nodeName = element.nodeName.toLowerCase(),
+ tabIndex = $.attr( element, "tabindex" );
+ if ( "area" === nodeName ) {
+ var map = element.parentNode,
+ mapName = map.name,
+ img;
+ if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+ return false;
+ }
+ img = $( "img[usemap=#" + mapName + "]" )[0];
+ return !!img && visible( img );
+ }
+ return ( /input|select|textarea|button|object/.test( nodeName )
+ ? !element.disabled
+ : "a" == nodeName
+ ? element.href || !isNaN( tabIndex )
+ : !isNaN( tabIndex ))
+ // the element and all of its ancestors must be visible
+ && visible( element );
+ },
+
+ tabbable: function( element ) {
+ var tabIndex = $.attr( element, "tabindex" );
+ return ( isNaN( tabIndex ) || tabIndex >= 0 ) && $( element ).is( ":focusable" );
+ }
+});
+
+// support
+$(function() {
+ var body = document.body,
+ div = body.appendChild( div = document.createElement( "div" ) );
+
+ $.extend( div.style, {
+ minHeight: "100px",
+ height: "auto",
+ padding: 0,
+ borderWidth: 0
+ });
+
+ $.support.minHeight = div.offsetHeight === 100;
+ $.support.selectstart = "onselectstart" in div;
+
+ // set display to none to avoid a layout bug in IE
+ // http://dev.jquery.com/ticket/4014
+ body.removeChild( div ).style.display = "none";
+});
+
+
+
+
+
+// deprecated
+$.extend( $.ui, {
+ // $.ui.plugin is deprecated. Use the proxy pattern instead.
+ plugin: {
+ add: function( module, option, set ) {
+ var proto = $.ui[ module ].prototype;
+ for ( var i in set ) {
+ proto.plugins[ i ] = proto.plugins[ i ] || [];
+ proto.plugins[ i ].push( [ option, set[ i ] ] );
+ }
+ },
+ call: function( instance, name, args ) {
+ var set = instance.plugins[ name ];
+ if ( !set || !instance.element[ 0 ].parentNode ) {
+ return;
+ }
+
+ for ( var i = 0; i < set.length; i++ ) {
+ if ( instance.options[ set[ i ][ 0 ] ] ) {
+ set[ i ][ 1 ].apply( instance.element, args );
+ }
+ }
+ }
+ },
+
+ // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
+ contains: function( a, b ) {
+ return document.compareDocumentPosition ?
+ a.compareDocumentPosition( b ) & 16 :
+ a !== b && a.contains( b );
+ },
+
+ // only used by resizable
+ hasScroll: function( el, a ) {
+
+ //If overflow is hidden, the element might have extra content, but the user wants to hide it
+ if ( $( el ).css( "overflow" ) === "hidden") {
+ return false;
+ }
+
+ var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
+ has = false;
+
+ if ( el[ scroll ] > 0 ) {
+ return true;
+ }
+
+ // TODO: determine which cases actually cause this to happen
+ // if the element doesn't have the scroll set, see if it's possible to
+ // set the scroll
+ el[ scroll ] = 1;
+ has = ( el[ scroll ] > 0 );
+ el[ scroll ] = 0;
+ return has;
+ },
+
+ // these are odd functions, fix the API or move into individual plugins
+ isOverAxis: function( x, reference, size ) {
+ //Determines when x coordinate is over "b" element axis
+ return ( x > reference ) && ( x < ( reference + size ) );
+ },
+ isOver: function( y, x, top, left, height, width ) {
+ //Determines when x, y coordinates is over "b" element
+ return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
+ }
+});
+
+})( jQuery );
+/*!
+ * jQuery UI Widget 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function( $, undefined ) {
+
+// jQuery 1.4+
+if ( $.cleanData ) {
+ var _cleanData = $.cleanData;
+ $.cleanData = function( elems ) {
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ $( elem ).triggerHandler( "remove" );
+ }
+ _cleanData( elems );
+ };
+} else {
+ var _remove = $.fn.remove;
+ $.fn.remove = function( selector, keepData ) {
+ return this.each(function() {
+ if ( !keepData ) {
+ if ( !selector || $.filter( selector, [ this ] ).length ) {
+ $( "*", this ).add( [ this ] ).each(function() {
+ $( this ).triggerHandler( "remove" );
+ });
+ }
+ }
+ return _remove.call( $(this), selector, keepData );
+ });
+ };
+}
+
+$.widget = function( name, base, prototype ) {
+ var namespace = name.split( "." )[ 0 ],
+ fullName;
+ name = name.split( "." )[ 1 ];
+ fullName = namespace + "-" + name;
+
+ if ( !prototype ) {
+ prototype = base;
+ base = $.Widget;
+ }
+
+ // create selector for plugin
+ $.expr[ ":" ][ fullName ] = function( elem ) {
+ return !!$.data( elem, name );
+ };
+
+ $[ namespace ] = $[ namespace ] || {};
+ $[ namespace ][ name ] = function( options, element ) {
+ // allow instantiation without initializing for simple inheritance
+ if ( arguments.length ) {
+ this._createWidget( options, element );
+ }
+ };
+
+ var basePrototype = new base();
+ // we need to make the options hash a property directly on the new instance
+ // otherwise we'll modify the options hash on the prototype that we're
+ // inheriting from
+// $.each( basePrototype, function( key, val ) {
+// if ( $.isPlainObject(val) ) {
+// basePrototype[ key ] = $.extend( {}, val );
+// }
+// });
+ basePrototype.options = $.extend( true, {}, basePrototype.options );
+ $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+ namespace: namespace,
+ widgetName: name,
+ widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
+ widgetBaseClass: fullName
+ }, prototype );
+
+ $.widget.bridge( name, $[ namespace ][ name ] );
+};
+
+$.widget.bridge = function( name, object ) {
+ $.fn[ name ] = function( options ) {
+ var isMethodCall = typeof options === "string",
+ args = Array.prototype.slice.call( arguments, 1 ),
+ returnValue = this;
+
+ // allow multiple hashes to be passed on init
+ options = !isMethodCall && args.length ?
+ $.extend.apply( null, [ true, options ].concat(args) ) :
+ options;
+
+ // prevent calls to internal methods
+ if ( isMethodCall && options.charAt( 0 ) === "_" ) {
+ return returnValue;
+ }
+
+ if ( isMethodCall ) {
+ this.each(function() {
+ var instance = $.data( this, name ),
+ methodValue = instance && $.isFunction( instance[options] ) ?
+ instance[ options ].apply( instance, args ) :
+ instance;
+ // TODO: add this back in 1.9 and use $.error() (see #5972)
+// if ( !instance ) {
+// throw "cannot call methods on " + name + " prior to initialization; " +
+// "attempted to call method '" + options + "'";
+// }
+// if ( !$.isFunction( instance[options] ) ) {
+// throw "no such method '" + options + "' for " + name + " widget instance";
+// }
+// var methodValue = instance[ options ].apply( instance, args );
+ if ( methodValue !== instance && methodValue !== undefined ) {
+ returnValue = methodValue;
+ return false;
+ }
+ });
+ } else {
+ this.each(function() {
+ var instance = $.data( this, name );
+ if ( instance ) {
+ instance.option( options || {} )._init();
+ } else {
+ $.data( this, name, new object( options, this ) );
+ }
+ });
+ }
+
+ return returnValue;
+ };
+};
+
+$.Widget = function( options, element ) {
+ // allow instantiation without initializing for simple inheritance
+ if ( arguments.length ) {
+ this._createWidget( options, element );
+ }
+};
+
+$.Widget.prototype = {
+ widgetName: "widget",
+ widgetEventPrefix: "",
+ options: {
+ disabled: false
+ },
+ _createWidget: function( options, element ) {
+ // $.widget.bridge stores the plugin instance, but we do it anyway
+ // so that it's stored even before the _create function runs
+ $.data( element, this.widgetName, this );
+ this.element = $( element );
+ this.options = $.extend( true, {},
+ this.options,
+ this._getCreateOptions(),
+ options );
+
+ var self = this;
+ this.element.bind( "remove." + this.widgetName, function() {
+ self.destroy();
+ });
+
+ this._create();
+ this._trigger( "create" );
+ this._init();
+ },
+ _getCreateOptions: function() {
+ return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+ },
+ _create: function() {},
+ _init: function() {},
+
+ destroy: function() {
+ this.element
+ .unbind( "." + this.widgetName )
+ .removeData( this.widgetName );
+ this.widget()
+ .unbind( "." + this.widgetName )
+ .removeAttr( "aria-disabled" )
+ .removeClass(
+ this.widgetBaseClass + "-disabled " +
+ "ui-state-disabled" );
+ },
+
+ widget: function() {
+ return this.element;
+ },
+
+ option: function( key, value ) {
+ var options = key;
+
+ if ( arguments.length === 0 ) {
+ // don't return a reference to the internal hash
+ return $.extend( {}, this.options );
+ }
+
+ if (typeof key === "string" ) {
+ if ( value === undefined ) {
+ return this.options[ key ];
+ }
+ options = {};
+ options[ key ] = value;
+ }
+
+ this._setOptions( options );
+
+ return this;
+ },
+ _setOptions: function( options ) {
+ var self = this;
+ $.each( options, function( key, value ) {
+ self._setOption( key, value );
+ });
+
+ return this;
+ },
+ _setOption: function( key, value ) {
+ this.options[ key ] = value;
+
+ if ( key === "disabled" ) {
+ this.widget()
+ [ value ? "addClass" : "removeClass"](
+ this.widgetBaseClass + "-disabled" + " " +
+ "ui-state-disabled" )
+ .attr( "aria-disabled", value );
+ }
+
+ return this;
+ },
+
+ enable: function() {
+ return this._setOption( "disabled", false );
+ },
+ disable: function() {
+ return this._setOption( "disabled", true );
+ },
+
+ _trigger: function( type, event, data ) {
+ var callback = this.options[ type ];
+
+ event = $.Event( event );
+ event.type = ( type === this.widgetEventPrefix ?
+ type :
+ this.widgetEventPrefix + type ).toLowerCase();
+ data = data || {};
+
+ // copy original event properties over to the new event
+ // this would happen if we could call $.event.fix instead of $.Event
+ // but we don't have a way to force an event to be fixed multiple times
+ if ( event.originalEvent ) {
+ for ( var i = $.event.props.length, prop; i; ) {
+ prop = $.event.props[ --i ];
+ event[ prop ] = event.originalEvent[ prop ];
+ }
+ }
+
+ this.element.trigger( event, data );
+
+ return !( $.isFunction(callback) &&
+ callback.call( this.element[0], event, data ) === false ||
+ event.isDefaultPrevented() );
+ }
+};
+
+})( jQuery );
+/*!
+ * jQuery UI Mouse 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.mouse", {
+ options: {
+ cancel: ':input,option',
+ distance: 1,
+ delay: 0
+ },
+ _mouseInit: function() {
+ var self = this;
+
+ this.element
+ .bind('mousedown.'+this.widgetName, function(event) {
+ return self._mouseDown(event);
+ })
+ .bind('click.'+this.widgetName, function(event) {
+ if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
+ $.removeData(event.target, self.widgetName + '.preventClickEvent');
+ event.stopImmediatePropagation();
+ return false;
+ }
+ });
+
+ this.started = false;
+ },
+
+ // TODO: make sure destroying one instance of mouse doesn't mess with
+ // other instances of mouse
+ _mouseDestroy: function() {
+ this.element.unbind('.'+this.widgetName);
+ },
+
+ _mouseDown: function(event) {
+ // don't let more than one widget handle mouseStart
+ // TODO: figure out why we have to use originalEvent
+ event.originalEvent = event.originalEvent || {};
+ if (event.originalEvent.mouseHandled) { return; }
+
+ // we may have missed mouseup (out of window)
+ (this._mouseStarted && this._mouseUp(event));
+
+ this._mouseDownEvent = event;
+
+ var self = this,
+ btnIsLeft = (event.which == 1),
+ elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+ return true;
+ }
+
+ this.mouseDelayMet = !this.options.delay;
+ if (!this.mouseDelayMet) {
+ this._mouseDelayTimer = setTimeout(function() {
+ self.mouseDelayMet = true;
+ }, this.options.delay);
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted = (this._mouseStart(event) !== false);
+ if (!this._mouseStarted) {
+ event.preventDefault();
+ return true;
+ }
+ }
+
+ // these delegates are required to keep context
+ this._mouseMoveDelegate = function(event) {
+ return self._mouseMove(event);
+ };
+ this._mouseUpDelegate = function(event) {
+ return self._mouseUp(event);
+ };
+ $(document)
+ .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+ .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+ event.preventDefault();
+ event.originalEvent.mouseHandled = true;
+ return true;
+ },
+
+ _mouseMove: function(event) {
+ // IE mouseup check - mouseup happened when mouse was out of window
+ if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
+ return this._mouseUp(event);
+ }
+
+ if (this._mouseStarted) {
+ this._mouseDrag(event);
+ return event.preventDefault();
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted =
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+ }
+
+ return !this._mouseStarted;
+ },
+
+ _mouseUp: function(event) {
+ $(document)
+ .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+ .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+ if (this._mouseStarted) {
+ this._mouseStarted = false;
+
+ if (event.target == this._mouseDownEvent.target) {
+ $.data(event.target, this.widgetName + '.preventClickEvent', true);
+ }
+
+ this._mouseStop(event);
+ }
+
+ return false;
+ },
+
+ _mouseDistanceMet: function(event) {
+ return (Math.max(
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
+ ) >= this.options.distance
+ );
+ },
+
+ _mouseDelayMet: function(event) {
+ return this.mouseDelayMet;
+ },
+
+ // These are placeholder methods, to be overriden by extending plugin
+ _mouseStart: function(event) {},
+ _mouseDrag: function(event) {},
+ _mouseStop: function(event) {},
+ _mouseCapture: function(event) { return true; }
+});
+
+})(jQuery);
+/*
+ * jQuery UI Position 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function( $, undefined ) {
+
+$.ui = $.ui || {};
+
+var horizontalPositions = /left|center|right/,
+ verticalPositions = /top|center|bottom/,
+ center = "center",
+ _position = $.fn.position,
+ _offset = $.fn.offset;
+
+$.fn.position = function( options ) {
+ if ( !options || !options.of ) {
+ return _position.apply( this, arguments );
+ }
+
+ // make a copy, we don't want to modify arguments
+ options = $.extend( {}, options );
+
+ var target = $( options.of ),
+ targetElem = target[0],
+ collision = ( options.collision || "flip" ).split( " " ),
+ offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
+ targetWidth,
+ targetHeight,
+ basePosition;
+
+ if ( targetElem.nodeType === 9 ) {
+ targetWidth = target.width();
+ targetHeight = target.height();
+ basePosition = { top: 0, left: 0 };
+ // TODO: use $.isWindow() in 1.9
+ } else if ( targetElem.setTimeout ) {
+ targetWidth = target.width();
+ targetHeight = target.height();
+ basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
+ } else if ( targetElem.preventDefault ) {
+ // force left top to allow flipping
+ options.at = "left top";
+ targetWidth = targetHeight = 0;
+ basePosition = { top: options.of.pageY, left: options.of.pageX };
+ } else {
+ targetWidth = target.outerWidth();
+ targetHeight = target.outerHeight();
+ basePosition = target.offset();
+ }
+
+ // force my and at to have valid horizontal and veritcal positions
+ // if a value is missing or invalid, it will be converted to center
+ $.each( [ "my", "at" ], function() {
+ var pos = ( options[this] || "" ).split( " " );
+ if ( pos.length === 1) {
+ pos = horizontalPositions.test( pos[0] ) ?
+ pos.concat( [center] ) :
+ verticalPositions.test( pos[0] ) ?
+ [ center ].concat( pos ) :
+ [ center, center ];
+ }
+ pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
+ pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
+ options[ this ] = pos;
+ });
+
+ // normalize collision option
+ if ( collision.length === 1 ) {
+ collision[ 1 ] = collision[ 0 ];
+ }
+
+ // normalize offset option
+ offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
+ if ( offset.length === 1 ) {
+ offset[ 1 ] = offset[ 0 ];
+ }
+ offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
+
+ if ( options.at[0] === "right" ) {
+ basePosition.left += targetWidth;
+ } else if ( options.at[0] === center ) {
+ basePosition.left += targetWidth / 2;
+ }
+
+ if ( options.at[1] === "bottom" ) {
+ basePosition.top += targetHeight;
+ } else if ( options.at[1] === center ) {
+ basePosition.top += targetHeight / 2;
+ }
+
+ basePosition.left += offset[ 0 ];
+ basePosition.top += offset[ 1 ];
+
+ return this.each(function() {
+ var elem = $( this ),
+ elemWidth = elem.outerWidth(),
+ elemHeight = elem.outerHeight(),
+ marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
+ marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
+ collisionWidth = elemWidth + marginLeft +
+ ( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
+ collisionHeight = elemHeight + marginTop +
+ ( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
+ position = $.extend( {}, basePosition ),
+ collisionPosition;
+
+ if ( options.my[0] === "right" ) {
+ position.left -= elemWidth;
+ } else if ( options.my[0] === center ) {
+ position.left -= elemWidth / 2;
+ }
+
+ if ( options.my[1] === "bottom" ) {
+ position.top -= elemHeight;
+ } else if ( options.my[1] === center ) {
+ position.top -= elemHeight / 2;
+ }
+
+ // prevent fractions (see #5280)
+ position.left = Math.round( position.left );
+ position.top = Math.round( position.top );
+
+ collisionPosition = {
+ left: position.left - marginLeft,
+ top: position.top - marginTop
+ };
+
+ $.each( [ "left", "top" ], function( i, dir ) {
+ if ( $.ui.position[ collision[i] ] ) {
+ $.ui.position[ collision[i] ][ dir ]( position, {
+ targetWidth: targetWidth,
+ targetHeight: targetHeight,
+ elemWidth: elemWidth,
+ elemHeight: elemHeight,
+ collisionPosition: collisionPosition,
+ collisionWidth: collisionWidth,
+ collisionHeight: collisionHeight,
+ offset: offset,
+ my: options.my,
+ at: options.at
+ });
+ }
+ });
+
+ if ( $.fn.bgiframe ) {
+ elem.bgiframe();
+ }
+ elem.offset( $.extend( position, { using: options.using } ) );
+ });
+};
+
+$.ui.position = {
+ fit: {
+ left: function( position, data ) {
+ var win = $( window ),
+ over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
+ position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
+ },
+ top: function( position, data ) {
+ var win = $( window ),
+ over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
+ position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
+ }
+ },
+
+ flip: {
+ left: function( position, data ) {
+ if ( data.at[0] === center ) {
+ return;
+ }
+ var win = $( window ),
+ over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
+ myOffset = data.my[ 0 ] === "left" ?
+ -data.elemWidth :
+ data.my[ 0 ] === "right" ?
+ data.elemWidth :
+ 0,
+ atOffset = data.at[ 0 ] === "left" ?
+ data.targetWidth :
+ -data.targetWidth,
+ offset = -2 * data.offset[ 0 ];
+ position.left += data.collisionPosition.left < 0 ?
+ myOffset + atOffset + offset :
+ over > 0 ?
+ myOffset + atOffset + offset :
+ 0;
+ },
+ top: function( position, data ) {
+ if ( data.at[1] === center ) {
+ return;
+ }
+ var win = $( window ),
+ over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
+ myOffset = data.my[ 1 ] === "top" ?
+ -data.elemHeight :
+ data.my[ 1 ] === "bottom" ?
+ data.elemHeight :
+ 0,
+ atOffset = data.at[ 1 ] === "top" ?
+ data.targetHeight :
+ -data.targetHeight,
+ offset = -2 * data.offset[ 1 ];
+ position.top += data.collisionPosition.top < 0 ?
+ myOffset + atOffset + offset :
+ over > 0 ?
+ myOffset + atOffset + offset :
+ 0;
+ }
+ }
+};
+
+// offset setter from jQuery 1.4
+if ( !$.offset.setOffset ) {
+ $.offset.setOffset = function( elem, options ) {
+ // set position first, in-case top/left are set even on static elem
+ if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
+ elem.style.position = "relative";
+ }
+ var curElem = $( elem ),
+ curOffset = curElem.offset(),
+ curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0,
+ curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0,
+ props = {
+ top: (options.top - curOffset.top) + curTop,
+ left: (options.left - curOffset.left) + curLeft
+ };
+
+ if ( 'using' in options ) {
+ options.using.call( elem, props );
+ } else {
+ curElem.css( props );
+ }
+ };
+
+ $.fn.offset = function( options ) {
+ var elem = this[ 0 ];
+ if ( !elem || !elem.ownerDocument ) { return null; }
+ if ( options ) {
+ return this.each(function() {
+ $.offset.setOffset( this, options );
+ });
+ }
+ return _offset.call( this );
+ };
+}
+
+}( jQuery ));
+/*
+ * jQuery UI Draggable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.draggable", $.ui.mouse, {
+ widgetEventPrefix: "drag",
+ options: {
+ addClasses: true,
+ appendTo: "parent",
+ axis: false,
+ connectToSortable: false,
+ containment: false,
+ cursor: "auto",
+ cursorAt: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ iframeFix: false,
+ opacity: false,
+ refreshPositions: false,
+ revert: false,
+ revertDuration: 500,
+ scope: "default",
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ snap: false,
+ snapMode: "both",
+ snapTolerance: 20,
+ stack: false,
+ zIndex: false
+ },
+ _create: function() {
+
+ if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
+ this.element[0].style.position = 'relative';
+
+ (this.options.addClasses && this.element.addClass("ui-draggable"));
+ (this.options.disabled && this.element.addClass("ui-draggable-disabled"));
+
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+ if(!this.element.data('draggable')) return;
+ this.element
+ .removeData("draggable")
+ .unbind(".draggable")
+ .removeClass("ui-draggable"
+ + " ui-draggable-dragging"
+ + " ui-draggable-disabled");
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseCapture: function(event) {
+
+ var o = this.options;
+
+ // among others, prevent a drag on a resizable-handle
+ if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
+ return false;
+
+ //Quit if we're not on a valid handle
+ this.handle = this._getHandle(event);
+ if (!this.handle)
+ return false;
+
+ return true;
+
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options;
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ //If ddmanager is used for droppables, set the global draggable
+ if($.ui.ddmanager)
+ $.ui.ddmanager.current = this;
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Store the helper's css position
+ this.cssPosition = this.helper.css("position");
+ this.scrollParent = this.helper.scrollParent();
+
+ //The element's absolute position on the page minus margins
+ this.offset = this.positionAbs = this.element.offset();
+ this.offset = {
+ top: this.offset.top - this.margins.top,
+ left: this.offset.left - this.margins.left
+ };
+
+ $.extend(this.offset, {
+ click: { //Where the click happened, relative to the element
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ },
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+ });
+
+ //Generate the original position
+ this.originalPosition = this.position = this._generatePosition(event);
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Set a containment if given in the options
+ if(o.containment)
+ this._setContainment();
+
+ //Trigger event + callbacks
+ if(this._trigger("start", event) === false) {
+ this._clear();
+ return false;
+ }
+
+ //Recache the helper size
+ this._cacheHelperProportions();
+
+ //Prepare the droppable offsets
+ if ($.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+
+ this.helper.addClass("ui-draggable-dragging");
+ this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+ return true;
+ },
+
+ _mouseDrag: function(event, noPropagation) {
+
+ //Compute the helpers position
+ this.position = this._generatePosition(event);
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Call plugins and callbacks and use the resulting position if something is returned
+ if (!noPropagation) {
+ var ui = this._uiHash();
+ if(this._trigger('drag', event, ui) === false) {
+ this._mouseUp({});
+ return false;
+ }
+ this.position = ui.position;
+ }
+
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ //If we are using droppables, inform the manager about the drop
+ var dropped = false;
+ if ($.ui.ddmanager && !this.options.dropBehaviour)
+ dropped = $.ui.ddmanager.drop(this, event);
+
+ //if a drop comes from outside (a sortable)
+ if(this.dropped) {
+ dropped = this.dropped;
+ this.dropped = false;
+ }
+
+ //if the original element is removed, don't bother to continue if helper is set to "original"
+ if((!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original")
+ return false;
+
+ if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
+ var self = this;
+ $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
+ if(self._trigger("stop", event) !== false) {
+ self._clear();
+ }
+ });
+ } else {
+ if(this._trigger("stop", event) !== false) {
+ this._clear();
+ }
+ }
+
+ return false;
+ },
+
+ cancel: function() {
+
+ if(this.helper.is(".ui-draggable-dragging")) {
+ this._mouseUp({});
+ } else {
+ this._clear();
+ }
+
+ return this;
+
+ },
+
+ _getHandle: function(event) {
+
+ var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
+ $(this.options.handle, this.element)
+ .find("*")
+ .andSelf()
+ .each(function() {
+ if(this == event.target) handle = true;
+ });
+
+ return handle;
+
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options;
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element);
+
+ if(!helper.parents('body').length)
+ helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
+
+ if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
+ helper.css("position", "absolute");
+
+ return helper;
+
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj == 'string') {
+ obj = obj.split(' ');
+ }
+ if ($.isArray(obj)) {
+ obj = {left: +obj[0], top: +obj[1] || 0};
+ }
+ if ('left' in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ('right' in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+ }
+ if ('top' in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ('bottom' in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+ }
+ },
+
+ _getParentOffset: function() {
+
+ //Get the offsetParent and cache its position
+ this.offsetParent = this.helper.offsetParent();
+ var po = this.offsetParent.offset();
+
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+ if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+ || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+ po = { top: 0, left: 0 };
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+
+ if(this.cssPosition == "relative") {
+ var p = this.element.position();
+ return {
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+ };
+ } else {
+ return { top: 0, left: 0 };
+ }
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.element.css("marginLeft"),10) || 0),
+ top: (parseInt(this.element.css("marginTop"),10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var o = this.options;
+ if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+ if(o.containment == 'document' || o.containment == 'window') this.containment = [
+ (o.containment == 'document' ? 0 : $(window).scrollLeft()) - this.offset.relative.left - this.offset.parent.left,
+ (o.containment == 'document' ? 0 : $(window).scrollTop()) - this.offset.relative.top - this.offset.parent.top,
+ (o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+ (o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+ ];
+
+ if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
+ var ce = $(o.containment)[0]; if(!ce) return;
+ var co = $(o.containment).offset();
+ var over = ($(ce).css("overflow") != 'hidden');
+
+ this.containment = [
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+ ];
+ } else if(o.containment.constructor == Array) {
+ this.containment = o.containment;
+ }
+
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if(!pos) pos = this.position;
+ var mod = d == "absolute" ? 1 : -1;
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ return {
+ top: (
+ pos.top // The absolute mouse position
+ + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+ ),
+ left: (
+ pos.left // The absolute mouse position
+ + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function(event) {
+
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+ var pageX = event.pageX;
+ var pageY = event.pageY;
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+ if(this.containment) {
+ if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+ if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+ }
+
+ if(o.grid) {
+ var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+ pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+ var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+ pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ }
+
+ }
+
+ return {
+ top: (
+ pageY // The absolute mouse position
+ - this.offset.click.top // Click offset (relative to the element)
+ - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+ ),
+ left: (
+ pageX // The absolute mouse position
+ - this.offset.click.left // Click offset (relative to the element)
+ - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+ )
+ };
+
+ },
+
+ _clear: function() {
+ this.helper.removeClass("ui-draggable-dragging");
+ if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
+ //if($.ui.ddmanager) $.ui.ddmanager.current = null;
+ this.helper = null;
+ this.cancelHelperRemoval = false;
+ },
+
+ // From now on bulk stuff - mainly helpers
+
+ _trigger: function(type, event, ui) {
+ ui = ui || this._uiHash();
+ $.ui.plugin.call(this, type, [event, ui]);
+ if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
+ return $.Widget.prototype._trigger.call(this, type, event, ui);
+ },
+
+ plugins: {},
+
+ _uiHash: function(event) {
+ return {
+ helper: this.helper,
+ position: this.position,
+ originalPosition: this.originalPosition,
+ offset: this.positionAbs
+ };
+ }
+
+});
+
+$.extend($.ui.draggable, {
+ version: "1.8.10"
+});
+
+$.ui.plugin.add("draggable", "connectToSortable", {
+ start: function(event, ui) {
+
+ var inst = $(this).data("draggable"), o = inst.options,
+ uiSortable = $.extend({}, ui, { item: inst.element });
+ inst.sortables = [];
+ $(o.connectToSortable).each(function() {
+ var sortable = $.data(this, 'sortable');
+ if (sortable && !sortable.options.disabled) {
+ inst.sortables.push({
+ instance: sortable,
+ shouldRevert: sortable.options.revert
+ });
+ sortable._refreshItems(); //Do a one-time refresh at start to refresh the containerCache
+ sortable._trigger("activate", event, uiSortable);
+ }
+ });
+
+ },
+ stop: function(event, ui) {
+
+ //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
+ var inst = $(this).data("draggable"),
+ uiSortable = $.extend({}, ui, { item: inst.element });
+
+ $.each(inst.sortables, function() {
+ if(this.instance.isOver) {
+
+ this.instance.isOver = 0;
+
+ inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
+ this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
+
+ //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
+ if(this.shouldRevert) this.instance.options.revert = true;
+
+ //Trigger the stop of the sortable
+ this.instance._mouseStop(event);
+
+ this.instance.options.helper = this.instance.options._helper;
+
+ //If the helper has been the original item, restore properties in the sortable
+ if(inst.options.helper == 'original')
+ this.instance.currentItem.css({ top: 'auto', left: 'auto' });
+
+ } else {
+ this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
+ this.instance._trigger("deactivate", event, uiSortable);
+ }
+
+ });
+
+ },
+ drag: function(event, ui) {
+
+ var inst = $(this).data("draggable"), self = this;
+
+ var checkPos = function(o) {
+ var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
+ var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
+ var itemHeight = o.height, itemWidth = o.width;
+ var itemTop = o.top, itemLeft = o.left;
+
+ return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
+ };
+
+ $.each(inst.sortables, function(i) {
+
+ //Copy over some variables to allow calling the sortable's native _intersectsWith
+ this.instance.positionAbs = inst.positionAbs;
+ this.instance.helperProportions = inst.helperProportions;
+ this.instance.offset.click = inst.offset.click;
+
+ if(this.instance._intersectsWith(this.instance.containerCache)) {
+
+ //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
+ if(!this.instance.isOver) {
+
+ this.instance.isOver = 1;
+ //Now we fake the start of dragging for the sortable instance,
+ //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
+ //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
+ this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true);
+ this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
+ this.instance.options.helper = function() { return ui.helper[0]; };
+
+ event.target = this.instance.currentItem[0];
+ this.instance._mouseCapture(event, true);
+ this.instance._mouseStart(event, true, true);
+
+ //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
+ this.instance.offset.click.top = inst.offset.click.top;
+ this.instance.offset.click.left = inst.offset.click.left;
+ this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
+ this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
+
+ inst._trigger("toSortable", event);
+ inst.dropped = this.instance.element; //draggable revert needs that
+ //hack so receive/update callbacks work (mostly)
+ inst.currentItem = inst.element;
+ this.instance.fromOutside = inst;
+
+ }
+
+ //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
+ if(this.instance.currentItem) this.instance._mouseDrag(event);
+
+ } else {
+
+ //If it doesn't intersect with the sortable, and it intersected before,
+ //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
+ if(this.instance.isOver) {
+
+ this.instance.isOver = 0;
+ this.instance.cancelHelperRemoval = true;
+
+ //Prevent reverting on this forced stop
+ this.instance.options.revert = false;
+
+ // The out event needs to be triggered independently
+ this.instance._trigger('out', event, this.instance._uiHash(this.instance));
+
+ this.instance._mouseStop(event, true);
+ this.instance.options.helper = this.instance.options._helper;
+
+ //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
+ this.instance.currentItem.remove();
+ if(this.instance.placeholder) this.instance.placeholder.remove();
+
+ inst._trigger("fromSortable", event);
+ inst.dropped = false; //draggable revert needs that
+ }
+
+ };
+
+ });
+
+ }
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+ start: function(event, ui) {
+ var t = $('body'), o = $(this).data('draggable').options;
+ if (t.css("cursor")) o._cursor = t.css("cursor");
+ t.css("cursor", o.cursor);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ if (o._cursor) $('body').css("cursor", o._cursor);
+ }
+});
+
+$.ui.plugin.add("draggable", "iframeFix", {
+ start: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+ $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
+ .css({
+ width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+ position: "absolute", opacity: "0.001", zIndex: 1000
+ })
+ .css($(this).offset())
+ .appendTo("body");
+ });
+ },
+ stop: function(event, ui) {
+ $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers
+ }
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+ start: function(event, ui) {
+ var t = $(ui.helper), o = $(this).data('draggable').options;
+ if(t.css("opacity")) o._opacity = t.css("opacity");
+ t.css('opacity', o.opacity);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ if(o._opacity) $(ui.helper).css('opacity', o._opacity);
+ }
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+ start: function(event, ui) {
+ var i = $(this).data("draggable");
+ if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
+ },
+ drag: function(event, ui) {
+
+ var i = $(this).data("draggable"), o = i.options, scrolled = false;
+
+ if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
+
+ if(!o.axis || o.axis != 'x') {
+ if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+ i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
+ else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
+ i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
+ }
+
+ if(!o.axis || o.axis != 'y') {
+ if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+ i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
+ else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
+ i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
+ }
+
+ } else {
+
+ if(!o.axis || o.axis != 'x') {
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+ }
+
+ if(!o.axis || o.axis != 'y') {
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+ }
+
+ }
+
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(i, event);
+
+ }
+});
+
+$.ui.plugin.add("draggable", "snap", {
+ start: function(event, ui) {
+
+ var i = $(this).data("draggable"), o = i.options;
+ i.snapElements = [];
+
+ $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
+ var $t = $(this); var $o = $t.offset();
+ if(this != i.element[0]) i.snapElements.push({
+ item: this,
+ width: $t.outerWidth(), height: $t.outerHeight(),
+ top: $o.top, left: $o.left
+ });
+ });
+
+ },
+ drag: function(event, ui) {
+
+ var inst = $(this).data("draggable"), o = inst.options;
+ var d = o.snapTolerance;
+
+ var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+ y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+ for (var i = inst.snapElements.length - 1; i >= 0; i--){
+
+ var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
+ t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
+
+ //Yes, I know, this is insane ;)
+ if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
+ if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ inst.snapElements[i].snapping = false;
+ continue;
+ }
+
+ if(o.snapMode != 'inner') {
+ var ts = Math.abs(t - y2) <= d;
+ var bs = Math.abs(b - y1) <= d;
+ var ls = Math.abs(l - x2) <= d;
+ var rs = Math.abs(r - x1) <= d;
+ if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+ if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
+ if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
+ if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
+ }
+
+ var first = (ts || bs || ls || rs);
+
+ if(o.snapMode != 'outer') {
+ var ts = Math.abs(t - y1) <= d;
+ var bs = Math.abs(b - y2) <= d;
+ var ls = Math.abs(l - x1) <= d;
+ var rs = Math.abs(r - x2) <= d;
+ if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
+ if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+ if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
+ if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
+ }
+
+ if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
+ (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+ };
+
+ }
+});
+
+$.ui.plugin.add("draggable", "stack", {
+ start: function(event, ui) {
+
+ var o = $(this).data("draggable").options;
+
+ var group = $.makeArray($(o.stack)).sort(function(a,b) {
+ return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
+ });
+ if (!group.length) { return; }
+
+ var min = parseInt(group[0].style.zIndex) || 0;
+ $(group).each(function(i) {
+ this.style.zIndex = min + i;
+ });
+
+ this[0].style.zIndex = min + group.length;
+
+ }
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+ start: function(event, ui) {
+ var t = $(ui.helper), o = $(this).data("draggable").options;
+ if(t.css("zIndex")) o._zIndex = t.css("zIndex");
+ t.css('zIndex', o.zIndex);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data("draggable").options;
+ if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
+ }
+});
+
+})(jQuery);
+/*
+ * jQuery UI Droppable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.mouse.js
+ * jquery.ui.draggable.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.droppable", {
+ widgetEventPrefix: "drop",
+ options: {
+ accept: '*',
+ activeClass: false,
+ addClasses: true,
+ greedy: false,
+ hoverClass: false,
+ scope: 'default',
+ tolerance: 'intersect'
+ },
+ _create: function() {
+
+ var o = this.options, accept = o.accept;
+ this.isover = 0; this.isout = 1;
+
+ this.accept = $.isFunction(accept) ? accept : function(d) {
+ return d.is(accept);
+ };
+
+ //Store the droppable's proportions
+ this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
+
+ // Add the reference and positions to the manager
+ $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
+ $.ui.ddmanager.droppables[o.scope].push(this);
+
+ (o.addClasses && this.element.addClass("ui-droppable"));
+
+ },
+
+ destroy: function() {
+ var drop = $.ui.ddmanager.droppables[this.options.scope];
+ for ( var i = 0; i < drop.length; i++ )
+ if ( drop[i] == this )
+ drop.splice(i, 1);
+
+ this.element
+ .removeClass("ui-droppable ui-droppable-disabled")
+ .removeData("droppable")
+ .unbind(".droppable");
+
+ return this;
+ },
+
+ _setOption: function(key, value) {
+
+ if(key == 'accept') {
+ this.accept = $.isFunction(value) ? value : function(d) {
+ return d.is(value);
+ };
+ }
+ $.Widget.prototype._setOption.apply(this, arguments);
+ },
+
+ _activate: function(event) {
+ var draggable = $.ui.ddmanager.current;
+ if(this.options.activeClass) this.element.addClass(this.options.activeClass);
+ (draggable && this._trigger('activate', event, this.ui(draggable)));
+ },
+
+ _deactivate: function(event) {
+ var draggable = $.ui.ddmanager.current;
+ if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+ (draggable && this._trigger('deactivate', event, this.ui(draggable)));
+ },
+
+ _over: function(event) {
+
+ var draggable = $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+ if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
+ this._trigger('over', event, this.ui(draggable));
+ }
+
+ },
+
+ _out: function(event) {
+
+ var draggable = $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+ if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+ this._trigger('out', event, this.ui(draggable));
+ }
+
+ },
+
+ _drop: function(event,custom) {
+
+ var draggable = custom || $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
+
+ var childrenIntersection = false;
+ this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
+ var inst = $.data(this, 'droppable');
+ if(
+ inst.options.greedy
+ && !inst.options.disabled
+ && inst.options.scope == draggable.options.scope
+ && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
+ && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
+ ) { childrenIntersection = true; return false; }
+ });
+ if(childrenIntersection) return false;
+
+ if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+ if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+ this._trigger('drop', event, this.ui(draggable));
+ return this.element;
+ }
+
+ return false;
+
+ },
+
+ ui: function(c) {
+ return {
+ draggable: (c.currentItem || c.element),
+ helper: c.helper,
+ position: c.position,
+ offset: c.positionAbs
+ };
+ }
+
+});
+
+$.extend($.ui.droppable, {
+ version: "1.8.10"
+});
+
+$.ui.intersect = function(draggable, droppable, toleranceMode) {
+
+ if (!droppable.offset) return false;
+
+ var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
+ y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
+ var l = droppable.offset.left, r = l + droppable.proportions.width,
+ t = droppable.offset.top, b = t + droppable.proportions.height;
+
+ switch (toleranceMode) {
+ case 'fit':
+ return (l <= x1 && x2 <= r
+ && t <= y1 && y2 <= b);
+ break;
+ case 'intersect':
+ return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
+ && x2 - (draggable.helperProportions.width / 2) < r // Left Half
+ && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
+ && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
+ break;
+ case 'pointer':
+ var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
+ draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
+ isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
+ return isOver;
+ break;
+ case 'touch':
+ return (
+ (y1 >= t && y1 <= b) || // Top edge touching
+ (y2 >= t && y2 <= b) || // Bottom edge touching
+ (y1 < t && y2 > b) // Surrounded vertically
+ ) && (
+ (x1 >= l && x1 <= r) || // Left edge touching
+ (x2 >= l && x2 <= r) || // Right edge touching
+ (x1 < l && x2 > r) // Surrounded horizontally
+ );
+ break;
+ default:
+ return false;
+ break;
+ }
+
+};
+
+/*
+ This manager tracks offsets of draggables and droppables
+*/
+$.ui.ddmanager = {
+ current: null,
+ droppables: { 'default': [] },
+ prepareOffsets: function(t, event) {
+
+ var m = $.ui.ddmanager.droppables[t.options.scope] || [];
+ var type = event ? event.type : null; // workaround for #2317
+ var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
+
+ droppablesLoop: for (var i = 0; i < m.length; i++) {
+
+ if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted
+ for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
+ m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue
+
+ m[i].offset = m[i].element.offset();
+ m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
+
+ if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
+
+ }
+
+ },
+ drop: function(draggable, event) {
+
+ var dropped = false;
+ $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+ if(!this.options) return;
+ if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
+ dropped = dropped || this._drop.call(this, event);
+
+ if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ this.isout = 1; this.isover = 0;
+ this._deactivate.call(this, event);
+ }
+
+ });
+ return dropped;
+
+ },
+ drag: function(draggable, event) {
+
+ //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
+ if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
+
+ //Run through all droppables and check their positions based on specific tolerance options
+ $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+ if(this.options.disabled || this.greedyChild || !this.visible) return;
+ var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
+
+ var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
+ if(!c) return;
+
+ var parentInstance;
+ if (this.options.greedy) {
+ var parent = this.element.parents(':data(droppable):eq(0)');
+ if (parent.length) {
+ parentInstance = $.data(parent[0], 'droppable');
+ parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
+ }
+ }
+
+ // we just moved into a greedy child
+ if (parentInstance && c == 'isover') {
+ parentInstance['isover'] = 0;
+ parentInstance['isout'] = 1;
+ parentInstance._out.call(parentInstance, event);
+ }
+
+ this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
+ this[c == "isover" ? "_over" : "_out"].call(this, event);
+
+ // we just moved out of a greedy child
+ if (parentInstance && c == 'isout') {
+ parentInstance['isout'] = 0;
+ parentInstance['isover'] = 1;
+ parentInstance._over.call(parentInstance, event);
+ }
+ });
+
+ }
+};
+
+})(jQuery);
+/*
+ * jQuery UI Resizable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.resizable", $.ui.mouse, {
+ widgetEventPrefix: "resize",
+ options: {
+ alsoResize: false,
+ animate: false,
+ animateDuration: "slow",
+ animateEasing: "swing",
+ aspectRatio: false,
+ autoHide: false,
+ containment: false,
+ ghost: false,
+ grid: false,
+ handles: "e,s,se",
+ helper: false,
+ maxHeight: null,
+ maxWidth: null,
+ minHeight: 10,
+ minWidth: 10,
+ zIndex: 1000
+ },
+ _create: function() {
+
+ var self = this, o = this.options;
+ this.element.addClass("ui-resizable");
+
+ $.extend(this, {
+ _aspectRatio: !!(o.aspectRatio),
+ aspectRatio: o.aspectRatio,
+ originalElement: this.element,
+ _proportionallyResizeElements: [],
+ _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
+ });
+
+ //Wrap the element if it cannot hold child nodes
+ if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
+
+ //Opera fix for relative positioning
+ if (/relative/.test(this.element.css('position')) && $.browser.opera)
+ this.element.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ //Create a wrapper element and set the wrapper to the new current internal element
+ this.element.wrap(
+ $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
+ position: this.element.css('position'),
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight(),
+ top: this.element.css('top'),
+ left: this.element.css('left')
+ })
+ );
+
+ //Overwrite the original this.element
+ this.element = this.element.parent().data(
+ "resizable", this.element.data('resizable')
+ );
+
+ this.elementIsWrapper = true;
+
+ //Move margins to the wrapper
+ this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
+ this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
+
+ //Prevent Safari textarea resize
+ this.originalResizeStyle = this.originalElement.css('resize');
+ this.originalElement.css('resize', 'none');
+
+ //Push the actual element to our proportionallyResize internal array
+ this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
+
+ // avoid IE jump (hard set the margin)
+ this.originalElement.css({ margin: this.originalElement.css('margin') });
+
+ // fix handlers offset
+ this._proportionallyResize();
+
+ }
+
+ this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
+ if(this.handles.constructor == String) {
+
+ if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
+ var n = this.handles.split(","); this.handles = {};
+
+ for(var i = 0; i < n.length; i++) {
+
+ var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
+ var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
+
+ // increase zIndex of sw, se, ne, nw axis
+ //TODO : this modifies original option
+ if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
+
+ //TODO : What's going on here?
+ if ('se' == handle) {
+ axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
+ };
+
+ //Insert into internal handles object and append to element
+ this.handles[handle] = '.ui-resizable-'+handle;
+ this.element.append(axis);
+ }
+
+ }
+
+ this._renderAxis = function(target) {
+
+ target = target || this.element;
+
+ for(var i in this.handles) {
+
+ if(this.handles[i].constructor == String)
+ this.handles[i] = $(this.handles[i], this.element).show();
+
+ //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
+ if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
+
+ var axis = $(this.handles[i], this.element), padWrapper = 0;
+
+ //Checking the correct pad and border
+ padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+ //The padding type i have to apply...
+ var padPos = [ 'padding',
+ /ne|nw|n/.test(i) ? 'Top' :
+ /se|sw|s/.test(i) ? 'Bottom' :
+ /^e$/.test(i) ? 'Right' : 'Left' ].join("");
+
+ target.css(padPos, padWrapper);
+
+ this._proportionallyResize();
+
+ }
+
+ //TODO: What's that good for? There's not anything to be executed left
+ if(!$(this.handles[i]).length)
+ continue;
+
+ }
+ };
+
+ //TODO: make renderAxis a prototype function
+ this._renderAxis(this.element);
+
+ this._handles = $('.ui-resizable-handle', this.element)
+ .disableSelection();
+
+ //Matching axis name
+ this._handles.mouseover(function() {
+ if (!self.resizing) {
+ if (this.className)
+ var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+ //Axis, default = se
+ self.axis = axis && axis[1] ? axis[1] : 'se';
+ }
+ });
+
+ //If we want to auto hide the elements
+ if (o.autoHide) {
+ this._handles.hide();
+ $(this.element)
+ .addClass("ui-resizable-autohide")
+ .hover(function() {
+ $(this).removeClass("ui-resizable-autohide");
+ self._handles.show();
+ },
+ function(){
+ if (!self.resizing) {
+ $(this).addClass("ui-resizable-autohide");
+ self._handles.hide();
+ }
+ });
+ }
+
+ //Initialize the mouse interaction
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+
+ this._mouseDestroy();
+
+ var _destroy = function(exp) {
+ $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+ .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+ };
+
+ //TODO: Unwrap at same DOM position
+ if (this.elementIsWrapper) {
+ _destroy(this.element);
+ var wrapper = this.element;
+ wrapper.after(
+ this.originalElement.css({
+ position: wrapper.css('position'),
+ width: wrapper.outerWidth(),
+ height: wrapper.outerHeight(),
+ top: wrapper.css('top'),
+ left: wrapper.css('left')
+ })
+ ).remove();
+ }
+
+ this.originalElement.css('resize', this.originalResizeStyle);
+ _destroy(this.originalElement);
+
+ return this;
+ },
+
+ _mouseCapture: function(event) {
+ var handle = false;
+ for (var i in this.handles) {
+ if ($(this.handles[i])[0] == event.target) {
+ handle = true;
+ }
+ }
+
+ return !this.options.disabled && handle;
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options, iniPos = this.element.position(), el = this.element;
+
+ this.resizing = true;
+ this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
+
+ // bugfix for http://dev.jquery.com/ticket/1749
+ if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
+ el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
+ }
+
+ //Opera fixing relative position
+ if ($.browser.opera && (/relative/).test(el.css('position')))
+ el.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ this._renderProxy();
+
+ var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
+
+ if (o.containment) {
+ curleft += $(o.containment).scrollLeft() || 0;
+ curtop += $(o.containment).scrollTop() || 0;
+ }
+
+ //Store needed variables
+ this.offset = this.helper.offset();
+ this.position = { left: curleft, top: curtop };
+ this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+ this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+ this.originalPosition = { left: curleft, top: curtop };
+ this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
+ this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+ //Aspect Ratio
+ this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
+
+ var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+ $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+
+ el.addClass("ui-resizable-resizing");
+ this._propagate("start", event);
+ return true;
+ },
+
+ _mouseDrag: function(event) {
+
+ //Increase performance, avoid regex
+ var el = this.helper, o = this.options, props = {},
+ self = this, smp = this.originalMousePosition, a = this.axis;
+
+ var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
+ var trigger = this._change[a];
+ if (!trigger) return false;
+
+ // Calculate the attrs that will be change
+ var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+
+ if (this._aspectRatio || event.shiftKey)
+ data = this._updateRatio(data, event);
+
+ data = this._respectSize(data, event);
+
+ // plugins callbacks need to be called first
+ this._propagate("resize", event);
+
+ el.css({
+ top: this.position.top + "px", left: this.position.left + "px",
+ width: this.size.width + "px", height: this.size.height + "px"
+ });
+
+ if (!this._helper && this._proportionallyResizeElements.length)
+ this._proportionallyResize();
+
+ this._updateCache(data);
+
+ // calling the user callback at the end
+ this._trigger('resize', event, this.ui());
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ this.resizing = false;
+ var o = this.options, self = this;
+
+ if(this._helper) {
+ var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+ soffsetw = ista ? 0 : self.sizeDiff.width;
+
+ var s = { width: (self.helper.width() - soffsetw), height: (self.helper.height() - soffseth) },
+ left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+ top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+ if (!o.animate)
+ this.element.css($.extend(s, { top: top, left: left }));
+
+ self.helper.height(self.size.height);
+ self.helper.width(self.size.width);
+
+ if (this._helper && !o.animate) this._proportionallyResize();
+ }
+
+ $('body').css('cursor', 'auto');
+
+ this.element.removeClass("ui-resizable-resizing");
+
+ this._propagate("stop", event);
+
+ if (this._helper) this.helper.remove();
+ return false;
+
+ },
+
+ _updateCache: function(data) {
+ var o = this.options;
+ this.offset = this.helper.offset();
+ if (isNumber(data.left)) this.position.left = data.left;
+ if (isNumber(data.top)) this.position.top = data.top;
+ if (isNumber(data.height)) this.size.height = data.height;
+ if (isNumber(data.width)) this.size.width = data.width;
+ },
+
+ _updateRatio: function(data, event) {
+
+ var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
+
+ if (data.height) data.width = (csize.height * this.aspectRatio);
+ else if (data.width) data.height = (csize.width / this.aspectRatio);
+
+ if (a == 'sw') {
+ data.left = cpos.left + (csize.width - data.width);
+ data.top = null;
+ }
+ if (a == 'nw') {
+ data.top = cpos.top + (csize.height - data.height);
+ data.left = cpos.left + (csize.width - data.width);
+ }
+
+ return data;
+ },
+
+ _respectSize: function(data, event) {
+
+ var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
+ ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
+ isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
+
+ if (isminw) data.width = o.minWidth;
+ if (isminh) data.height = o.minHeight;
+ if (ismaxw) data.width = o.maxWidth;
+ if (ismaxh) data.height = o.maxHeight;
+
+ var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
+ var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+
+ if (isminw && cw) data.left = dw - o.minWidth;
+ if (ismaxw && cw) data.left = dw - o.maxWidth;
+ if (isminh && ch) data.top = dh - o.minHeight;
+ if (ismaxh && ch) data.top = dh - o.maxHeight;
+
+ // fixing jump error on top/left - bug #2330
+ var isNotwh = !data.width && !data.height;
+ if (isNotwh && !data.left && data.top) data.top = null;
+ else if (isNotwh && !data.top && data.left) data.left = null;
+
+ return data;
+ },
+
+ _proportionallyResize: function() {
+
+ var o = this.options;
+ if (!this._proportionallyResizeElements.length) return;
+ var element = this.helper || this.element;
+
+ for (var i=0; i < this._proportionallyResizeElements.length; i++) {
+
+ var prel = this._proportionallyResizeElements[i];
+
+ if (!this.borderDif) {
+ var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
+ p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
+
+ this.borderDif = $.map(b, function(v, i) {
+ var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
+ return border + padding;
+ });
+ }
+
+ if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
+ continue;
+
+ prel.css({
+ height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
+ width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
+ });
+
+ };
+
+ },
+
+ _renderProxy: function() {
+
+ var el = this.element, o = this.options;
+ this.elementOffset = el.offset();
+
+ if(this._helper) {
+
+ this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
+
+ // fix ie6 offset TODO: This seems broken
+ var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
+ pxyoffset = ( ie6 ? 2 : -1 );
+
+ this.helper.addClass(this._helper).css({
+ width: this.element.outerWidth() + pxyoffset,
+ height: this.element.outerHeight() + pxyoffset,
+ position: 'absolute',
+ left: this.elementOffset.left - ie6offset +'px',
+ top: this.elementOffset.top - ie6offset +'px',
+ zIndex: ++o.zIndex //TODO: Don't modify option
+ });
+
+ this.helper
+ .appendTo("body")
+ .disableSelection();
+
+ } else {
+ this.helper = this.element;
+ }
+
+ },
+
+ _change: {
+ e: function(event, dx, dy) {
+ return { width: this.originalSize.width + dx };
+ },
+ w: function(event, dx, dy) {
+ var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+ return { left: sp.left + dx, width: cs.width - dx };
+ },
+ n: function(event, dx, dy) {
+ var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+ return { top: sp.top + dy, height: cs.height - dy };
+ },
+ s: function(event, dx, dy) {
+ return { height: this.originalSize.height + dy };
+ },
+ se: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+ },
+ sw: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+ },
+ ne: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+ },
+ nw: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+ }
+ },
+
+ _propagate: function(n, event) {
+ $.ui.plugin.call(this, n, [event, this.ui()]);
+ (n != "resize" && this._trigger(n, event, this.ui()));
+ },
+
+ plugins: {},
+
+ ui: function() {
+ return {
+ originalElement: this.originalElement,
+ element: this.element,
+ helper: this.helper,
+ position: this.position,
+ size: this.size,
+ originalSize: this.originalSize,
+ originalPosition: this.originalPosition
+ };
+ }
+
+});
+
+$.extend($.ui.resizable, {
+ version: "1.8.10"
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+ start: function (event, ui) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var _store = function (exp) {
+ $(exp).each(function() {
+ var el = $(this);
+ el.data("resizable-alsoresize", {
+ width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
+ left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10),
+ position: el.css('position') // to reset Opera on stop()
+ });
+ });
+ };
+
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
+ if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
+ else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
+ }else{
+ _store(o.alsoResize);
+ }
+ },
+
+ resize: function (event, ui) {
+ var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+
+ var delta = {
+ height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
+ top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+ },
+
+ _alsoResize = function (exp, c) {
+ $(exp).each(function() {
+ var el = $(this), start = $(this).data("resizable-alsoresize"), style = {},
+ css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
+
+ $.each(css, function (i, prop) {
+ var sum = (start[prop]||0) + (delta[prop]||0);
+ if (sum && sum >= 0)
+ style[prop] = sum || null;
+ });
+
+ // Opera fixing relative position
+ if ($.browser.opera && /relative/.test(el.css('position'))) {
+ self._revertToRelativePosition = true;
+ el.css({ position: 'absolute', top: 'auto', left: 'auto' });
+ }
+
+ el.css(style);
+ });
+ };
+
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+ $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
+ }else{
+ _alsoResize(o.alsoResize);
+ }
+ },
+
+ stop: function (event, ui) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var _reset = function (exp) {
+ $(exp).each(function() {
+ var el = $(this);
+ // reset position for Opera - no need to verify it was changed
+ el.css({ position: el.data("resizable-alsoresize").position });
+ });
+ };
+
+ if (self._revertToRelativePosition) {
+ self._revertToRelativePosition = false;
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+ $.each(o.alsoResize, function (exp) { _reset(exp); });
+ }else{
+ _reset(o.alsoResize);
+ }
+ }
+
+ $(this).removeData("resizable-alsoresize");
+ }
+});
+
+$.ui.plugin.add("resizable", "animate", {
+
+ stop: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+ soffsetw = ista ? 0 : self.sizeDiff.width;
+
+ var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+ left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+ top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+ self.element.animate(
+ $.extend(style, top && left ? { top: top, left: left } : {}), {
+ duration: o.animateDuration,
+ easing: o.animateEasing,
+ step: function() {
+
+ var data = {
+ width: parseInt(self.element.css('width'), 10),
+ height: parseInt(self.element.css('height'), 10),
+ top: parseInt(self.element.css('top'), 10),
+ left: parseInt(self.element.css('left'), 10)
+ };
+
+ if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
+
+ // propagating resize, and updating values for each animation step
+ self._updateCache(data);
+ self._propagate("resize", event);
+
+ }
+ }
+ );
+ }
+
+});
+
+$.ui.plugin.add("resizable", "containment", {
+
+ start: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options, el = self.element;
+ var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
+ if (!ce) return;
+
+ self.containerElement = $(ce);
+
+ if (/document/.test(oc) || oc == document) {
+ self.containerOffset = { left: 0, top: 0 };
+ self.containerPosition = { left: 0, top: 0 };
+
+ self.parentData = {
+ element: $(document), left: 0, top: 0,
+ width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
+ };
+ }
+
+ // i'm a node, so compute top, left, right, bottom
+ else {
+ var element = $(ce), p = [];
+ $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
+
+ self.containerOffset = element.offset();
+ self.containerPosition = element.position();
+ self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+
+ var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width,
+ width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
+
+ self.parentData = {
+ element: ce, left: co.left, top: co.top, width: width, height: height
+ };
+ }
+ },
+
+ resize: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options,
+ ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
+ pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+
+ if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
+
+ if (cp.left < (self._helper ? co.left : 0)) {
+ self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
+ if (pRatio) self.size.height = self.size.width / o.aspectRatio;
+ self.position.left = o.helper ? co.left : 0;
+ }
+
+ if (cp.top < (self._helper ? co.top : 0)) {
+ self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
+ if (pRatio) self.size.width = self.size.height * o.aspectRatio;
+ self.position.top = self._helper ? co.top : 0;
+ }
+
+ self.offset.left = self.parentData.left+self.position.left;
+ self.offset.top = self.parentData.top+self.position.top;
+
+ var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
+ hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+
+ var isParent = self.containerElement.get(0) == self.element.parent().get(0),
+ isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+
+ if(isParent && isOffsetRelative) woset -= self.parentData.left;
+
+ if (woset + self.size.width >= self.parentData.width) {
+ self.size.width = self.parentData.width - woset;
+ if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+ }
+
+ if (hoset + self.size.height >= self.parentData.height) {
+ self.size.height = self.parentData.height - hoset;
+ if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+ }
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options, cp = self.position,
+ co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+
+ var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+
+ if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+ $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+ if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+ $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+ }
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+ start: function(event, ui) {
+
+ var self = $(this).data("resizable"), o = self.options, cs = self.size;
+
+ self.ghost = self.originalElement.clone();
+ self.ghost
+ .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
+ .addClass('ui-resizable-ghost')
+ .addClass(typeof o.ghost == 'string' ? o.ghost : '');
+
+ self.ghost.appendTo(self.helper);
+
+ },
+
+ resize: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options;
+ if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options;
+ if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+ }
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+ resize: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+ o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
+ var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
+
+ if (/^(se|s|e)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ }
+ else if (/^(ne)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.top = op.top - oy;
+ }
+ else if (/^(sw)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.left = op.left - ox;
+ }
+ else {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.top = op.top - oy;
+ self.position.left = op.left - ox;
+ }
+ }
+
+});
+
+var num = function(v) {
+ return parseInt(v, 10) || 0;
+};
+
+var isNumber = function(value) {
+ return !isNaN(parseInt(value, 10));
+};
+
+})(jQuery);
+/*
+ * jQuery UI Selectable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.selectable", $.ui.mouse, {
+ options: {
+ appendTo: 'body',
+ autoRefresh: true,
+ distance: 0,
+ filter: '*',
+ tolerance: 'touch'
+ },
+ _create: function() {
+ var self = this;
+
+ this.element.addClass("ui-selectable");
+
+ this.dragged = false;
+
+ // cache selectee children based on filter
+ var selectees;
+ this.refresh = function() {
+ selectees = $(self.options.filter, self.element[0]);
+ selectees.each(function() {
+ var $this = $(this);
+ var pos = $this.offset();
+ $.data(this, "selectable-item", {
+ element: this,
+ $element: $this,
+ left: pos.left,
+ top: pos.top,
+ right: pos.left + $this.outerWidth(),
+ bottom: pos.top + $this.outerHeight(),
+ startselected: false,
+ selected: $this.hasClass('ui-selected'),
+ selecting: $this.hasClass('ui-selecting'),
+ unselecting: $this.hasClass('ui-unselecting')
+ });
+ });
+ };
+ this.refresh();
+
+ this.selectees = selectees.addClass("ui-selectee");
+
+ this._mouseInit();
+
+ this.helper = $("<div class='ui-selectable-helper'></div>");
+ },
+
+ destroy: function() {
+ this.selectees
+ .removeClass("ui-selectee")
+ .removeData("selectable-item");
+ this.element
+ .removeClass("ui-selectable ui-selectable-disabled")
+ .removeData("selectable")
+ .unbind(".selectable");
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseStart: function(event) {
+ var self = this;
+
+ this.opos = [event.pageX, event.pageY];
+
+ if (this.options.disabled)
+ return;
+
+ var options = this.options;
+
+ this.selectees = $(options.filter, this.element[0]);
+
+ this._trigger("start", event);
+
+ $(options.appendTo).append(this.helper);
+ // position helper (lasso)
+ this.helper.css({
+ "left": event.clientX,
+ "top": event.clientY,
+ "width": 0,
+ "height": 0
+ });
+
+ if (options.autoRefresh) {
+ this.refresh();
+ }
+
+ this.selectees.filter('.ui-selected').each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.startselected = true;
+ if (!event.metaKey) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ });
+
+ $(event.target).parents().andSelf().each(function() {
+ var selectee = $.data(this, "selectable-item");
+ if (selectee) {
+ var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
+ selectee.$element
+ .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
+ .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
+ selectee.unselecting = !doSelect;
+ selectee.selecting = doSelect;
+ selectee.selected = doSelect;
+ // selectable (UN)SELECTING callback
+ if (doSelect) {
+ self._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ } else {
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ return false;
+ }
+ });
+
+ },
+
+ _mouseDrag: function(event) {
+ var self = this;
+ this.dragged = true;
+
+ if (this.options.disabled)
+ return;
+
+ var options = this.options;
+
+ var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
+ if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
+ if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
+ this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
+
+ this.selectees.each(function() {
+ var selectee = $.data(this, "selectable-item");
+ //prevent helper from being selected if appendTo: selectable
+ if (!selectee || selectee.element == self.element[0])
+ return;
+ var hit = false;
+ if (options.tolerance == 'touch') {
+ hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
+ } else if (options.tolerance == 'fit') {
+ hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
+ }
+
+ if (hit) {
+ // SELECT
+ if (selectee.selected) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+ }
+ if (selectee.unselecting) {
+ selectee.$element.removeClass('ui-unselecting');
+ selectee.unselecting = false;
+ }
+ if (!selectee.selecting) {
+ selectee.$element.addClass('ui-selecting');
+ selectee.selecting = true;
+ // selectable SELECTING callback
+ self._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ }
+ } else {
+ // UNSELECT
+ if (selectee.selecting) {
+ if (event.metaKey && selectee.startselected) {
+ selectee.$element.removeClass('ui-selecting');
+ selectee.selecting = false;
+ selectee.$element.addClass('ui-selected');
+ selectee.selected = true;
+ } else {
+ selectee.$element.removeClass('ui-selecting');
+ selectee.selecting = false;
+ if (selectee.startselected) {
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ }
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ if (selectee.selected) {
+ if (!event.metaKey && !selectee.startselected) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ }
+ });
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+ var self = this;
+
+ this.dragged = false;
+
+ var options = this.options;
+
+ $('.ui-unselecting', this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass('ui-unselecting');
+ selectee.unselecting = false;
+ selectee.startselected = false;
+ self._trigger("unselected", event, {
+ unselected: selectee.element
+ });
+ });
+ $('.ui-selecting', this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
+ selectee.selecting = false;
+ selectee.selected = true;
+ selectee.startselected = true;
+ self._trigger("selected", event, {
+ selected: selectee.element
+ });
+ });
+ this._trigger("stop", event);
+
+ this.helper.remove();
+
+ return false;
+ }
+
+});
+
+$.extend($.ui.selectable, {
+ version: "1.8.10"
+});
+
+})(jQuery);
+/*
+ * jQuery UI Sortable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.sortable", $.ui.mouse, {
+ widgetEventPrefix: "sort",
+ options: {
+ appendTo: "parent",
+ axis: false,
+ connectWith: false,
+ containment: false,
+ cursor: 'auto',
+ cursorAt: false,
+ dropOnEmpty: true,
+ forcePlaceholderSize: false,
+ forceHelperSize: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ items: '> *',
+ opacity: false,
+ placeholder: false,
+ revert: false,
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ scope: "default",
+ tolerance: "intersect",
+ zIndex: 1000
+ },
+ _create: function() {
+
+ var o = this.options;
+ this.containerCache = {};
+ this.element.addClass("ui-sortable");
+
+ //Get the items
+ this.refresh();
+
+ //Let's determine if the items are floating
+ this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false;
+
+ //Let's determine the parent's offset
+ this.offset = this.element.offset();
+
+ //Initialize mouse events for interaction
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass("ui-sortable ui-sortable-disabled")
+ .removeData("sortable")
+ .unbind(".sortable");
+ this._mouseDestroy();
+
+ for ( var i = this.items.length - 1; i >= 0; i-- )
+ this.items[i].item.removeData("sortable-item");
+
+ return this;
+ },
+
+ _setOption: function(key, value){
+ if ( key === "disabled" ) {
+ this.options[ key ] = value;
+
+ this.widget()
+ [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
+ } else {
+ // Don't call widget base _setOption for disable as it adds ui-state-disabled class
+ $.Widget.prototype._setOption.apply(this, arguments);
+ }
+ },
+
+ _mouseCapture: function(event, overrideHandle) {
+
+ if (this.reverting) {
+ return false;
+ }
+
+ if(this.options.disabled || this.options.type == 'static') return false;
+
+ //We have to refresh the items data once first
+ this._refreshItems(event);
+
+ //Find out if the clicked node (or one of its parents) is a actual item in this.items
+ var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
+ if($.data(this, 'sortable-item') == self) {
+ currentItem = $(this);
+ return false;
+ }
+ });
+ if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);
+
+ if(!currentItem) return false;
+ if(this.options.handle && !overrideHandle) {
+ var validHandle = false;
+
+ $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
+ if(!validHandle) return false;
+ }
+
+ this.currentItem = currentItem;
+ this._removeCurrentsFromItems();
+ return true;
+
+ },
+
+ _mouseStart: function(event, overrideHandle, noActivation) {
+
+ var o = this.options, self = this;
+ this.currentContainer = this;
+
+ //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
+ this.refreshPositions();
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Get the next scrolling parent
+ this.scrollParent = this.helper.scrollParent();
+
+ //The element's absolute position on the page minus margins
+ this.offset = this.currentItem.offset();
+ this.offset = {
+ top: this.offset.top - this.margins.top,
+ left: this.offset.left - this.margins.left
+ };
+
+ // Only after we got the offset, we can change the helper's position to absolute
+ // TODO: Still need to figure out a way to make relative sorting possible
+ this.helper.css("position", "absolute");
+ this.cssPosition = this.helper.css("position");
+
+ $.extend(this.offset, {
+ click: { //Where the click happened, relative to the element
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ },
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+ });
+
+ //Generate the original position
+ this.originalPosition = this._generatePosition(event);
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Cache the former DOM position
+ this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
+
+ //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
+ if(this.helper[0] != this.currentItem[0]) {
+ this.currentItem.hide();
+ }
+
+ //Create the placeholder
+ this._createPlaceholder();
+
+ //Set a containment if given in the options
+ if(o.containment)
+ this._setContainment();
+
+ if(o.cursor) { // cursor option
+ if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
+ $('body').css("cursor", o.cursor);
+ }
+
+ if(o.opacity) { // opacity option
+ if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
+ this.helper.css("opacity", o.opacity);
+ }
+
+ if(o.zIndex) { // zIndex option
+ if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
+ this.helper.css("zIndex", o.zIndex);
+ }
+
+ //Prepare scrolling
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
+ this.overflowOffset = this.scrollParent.offset();
+
+ //Call callbacks
+ this._trigger("start", event, this._uiHash());
+
+ //Recache the helper size
+ if(!this._preserveHelperProportions)
+ this._cacheHelperProportions();
+
+
+ //Post 'activate' events to possible containers
+ if(!noActivation) {
+ for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
+ }
+
+ //Prepare possible droppables
+ if($.ui.ddmanager)
+ $.ui.ddmanager.current = this;
+
+ if ($.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+
+ this.dragging = true;
+
+ this.helper.addClass("ui-sortable-helper");
+ this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+ return true;
+
+ },
+
+ _mouseDrag: function(event) {
+
+ //Compute the helpers position
+ this.position = this._generatePosition(event);
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ if (!this.lastPositionAbs) {
+ this.lastPositionAbs = this.positionAbs;
+ }
+
+ //Do scrolling
+ if(this.options.scroll) {
+ var o = this.options, scrolled = false;
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
+
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
+ else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
+
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
+ else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
+
+ } else {
+
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+
+ }
+
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+ }
+
+ //Regenerate the absolute position used for position checks
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Set the helper position
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+
+ //Rearrange
+ for (var i = this.items.length - 1; i >= 0; i--) {
+
+ //Cache variables and intersection, continue if no intersection
+ var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
+ if (!intersection) continue;
+
+ if(itemElement != this.currentItem[0] //cannot intersect with itself
+ && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
+ && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
+ && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
+ //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
+ ) {
+
+ this.direction = intersection == 1 ? "down" : "up";
+
+ if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
+ this._rearrange(event, item);
+ } else {
+ break;
+ }
+
+ this._trigger("change", event, this._uiHash());
+ break;
+ }
+ }
+
+ //Post events to containers
+ this._contactContainers(event);
+
+ //Interconnect with droppables
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+ //Call callbacks
+ this._trigger('sort', event, this._uiHash());
+
+ this.lastPositionAbs = this.positionAbs;
+ return false;
+
+ },
+
+ _mouseStop: function(event, noPropagation) {
+
+ if(!event) return;
+
+ //If we are using droppables, inform the manager about the drop
+ if ($.ui.ddmanager && !this.options.dropBehaviour)
+ $.ui.ddmanager.drop(this, event);
+
+ if(this.options.revert) {
+ var self = this;
+ var cur = self.placeholder.offset();
+
+ self.reverting = true;
+
+ $(this.helper).animate({
+ left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
+ top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
+ }, parseInt(this.options.revert, 10) || 500, function() {
+ self._clear(event);
+ });
+ } else {
+ this._clear(event, noPropagation);
+ }
+
+ return false;
+
+ },
+
+ cancel: function() {
+
+ var self = this;
+
+ if(this.dragging) {
+
+ this._mouseUp({ target: null });
+
+ if(this.options.helper == "original")
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ else
+ this.currentItem.show();
+
+ //Post deactivating events to containers
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ this.containers[i]._trigger("deactivate", null, self._uiHash(this));
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", null, self._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ if (this.placeholder) {
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+ if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+ if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
+
+ $.extend(this, {
+ helper: null,
+ dragging: false,
+ reverting: false,
+ _noFinalSort: null
+ });
+
+ if(this.domPosition.prev) {
+ $(this.domPosition.prev).after(this.currentItem);
+ } else {
+ $(this.domPosition.parent).prepend(this.currentItem);
+ }
+ }
+
+ return this;
+
+ },
+
+ serialize: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected);
+ var str = []; o = o || {};
+
+ $(items).each(function() {
+ var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
+ if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
+ });
+
+ if(!str.length && o.key) {
+ str.push(o.key + '=');
+ }
+
+ return str.join('&');
+
+ },
+
+ toArray: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected);
+ var ret = []; o = o || {};
+
+ items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
+ return ret;
+
+ },
+
+ /* Be careful with the following core functions */
+ _intersectsWith: function(item) {
+
+ var x1 = this.positionAbs.left,
+ x2 = x1 + this.helperProportions.width,
+ y1 = this.positionAbs.top,
+ y2 = y1 + this.helperProportions.height;
+
+ var l = item.left,
+ r = l + item.width,
+ t = item.top,
+ b = t + item.height;
+
+ var dyClick = this.offset.click.top,
+ dxClick = this.offset.click.left;
+
+ var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
+
+ if( this.options.tolerance == "pointer"
+ || this.options.forcePointerForContainers
+ || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
+ ) {
+ return isOverElement;
+ } else {
+
+ return (l < x1 + (this.helperProportions.width / 2) // Right Half
+ && x2 - (this.helperProportions.width / 2) < r // Left Half
+ && t < y1 + (this.helperProportions.height / 2) // Bottom Half
+ && y2 - (this.helperProportions.height / 2) < b ); // Top Half
+
+ }
+ },
+
+ _intersectsWithPointer: function(item) {
+
+ var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+ isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+ isOverElement = isOverElementHeight && isOverElementWidth,
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (!isOverElement)
+ return false;
+
+ return this.floating ?
+ ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
+ : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
+
+ },
+
+ _intersectsWithSides: function(item) {
+
+ var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
+ isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (this.floating && horizontalDirection) {
+ return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
+ } else {
+ return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
+ }
+
+ },
+
+ _getDragVerticalDirection: function() {
+ var delta = this.positionAbs.top - this.lastPositionAbs.top;
+ return delta != 0 && (delta > 0 ? "down" : "up");
+ },
+
+ _getDragHorizontalDirection: function() {
+ var delta = this.positionAbs.left - this.lastPositionAbs.left;
+ return delta != 0 && (delta > 0 ? "right" : "left");
+ },
+
+ refresh: function(event) {
+ this._refreshItems(event);
+ this.refreshPositions();
+ return this;
+ },
+
+ _connectWith: function() {
+ var options = this.options;
+ return options.connectWith.constructor == String
+ ? [options.connectWith]
+ : options.connectWith;
+ },
+
+ _getItemsAsjQuery: function(connected) {
+
+ var self = this;
+ var items = [];
+ var queries = [];
+ var connectWith = this._connectWith();
+
+ if(connectWith && connected) {
+ for (var i = connectWith.length - 1; i >= 0; i--){
+ var cur = $(connectWith[i]);
+ for (var j = cur.length - 1; j >= 0; j--){
+ var inst = $.data(cur[j], 'sortable');
+ if(inst && inst != this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
+ }
+ };
+ };
+ }
+
+ queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
+
+ for (var i = queries.length - 1; i >= 0; i--){
+ queries[i][0].each(function() {
+ items.push(this);
+ });
+ };
+
+ return $(items);
+
+ },
+
+ _removeCurrentsFromItems: function() {
+
+ var list = this.currentItem.find(":data(sortable-item)");
+
+ for (var i=0; i < this.items.length; i++) {
+
+ for (var j=0; j < list.length; j++) {
+ if(list[j] == this.items[i].item[0])
+ this.items.splice(i,1);
+ };
+
+ };
+
+ },
+
+ _refreshItems: function(event) {
+
+ this.items = [];
+ this.containers = [this];
+ var items = this.items;
+ var self = this;
+ var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
+ var connectWith = this._connectWith();
+
+ if(connectWith) {
+ for (var i = connectWith.length - 1; i >= 0; i--){
+ var cur = $(connectWith[i]);
+ for (var j = cur.length - 1; j >= 0; j--){
+ var inst = $.data(cur[j], 'sortable');
+ if(inst && inst != this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
+ this.containers.push(inst);
+ }
+ };
+ };
+ }
+
+ for (var i = queries.length - 1; i >= 0; i--) {
+ var targetData = queries[i][1];
+ var _queries = queries[i][0];
+
+ for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
+ var item = $(_queries[j]);
+
+ item.data('sortable-item', targetData); // Data for target checking (mouse manager)
+
+ items.push({
+ item: item,
+ instance: targetData,
+ width: 0, height: 0,
+ left: 0, top: 0
+ });
+ };
+ };
+
+ },
+
+ refreshPositions: function(fast) {
+
+ //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
+ if(this.offsetParent && this.helper) {
+ this.offset.parent = this._getParentOffset();
+ }
+
+ for (var i = this.items.length - 1; i >= 0; i--){
+ var item = this.items[i];
+
+ var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
+
+ if (!fast) {
+ item.width = t.outerWidth();
+ item.height = t.outerHeight();
+ }
+
+ var p = t.offset();
+ item.left = p.left;
+ item.top = p.top;
+ };
+
+ if(this.options.custom && this.options.custom.refreshContainers) {
+ this.options.custom.refreshContainers.call(this);
+ } else {
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ var p = this.containers[i].element.offset();
+ this.containers[i].containerCache.left = p.left;
+ this.containers[i].containerCache.top = p.top;
+ this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
+ this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
+ };
+ }
+
+ return this;
+ },
+
+ _createPlaceholder: function(that) {
+
+ var self = that || this, o = self.options;
+
+ if(!o.placeholder || o.placeholder.constructor == String) {
+ var className = o.placeholder;
+ o.placeholder = {
+ element: function() {
+
+ var el = $(document.createElement(self.currentItem[0].nodeName))
+ .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
+ .removeClass("ui-sortable-helper")[0];
+
+ if(!className)
+ el.style.visibility = "hidden";
+
+ return el;
+ },
+ update: function(container, p) {
+
+ // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
+ if(className && !o.forcePlaceholderSize) return;
+
+ //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
+ if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
+ if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
+ }
+ };
+ }
+
+ //Create the placeholder
+ self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
+
+ //Append it after the actual current item
+ self.currentItem.after(self.placeholder);
+
+ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+ o.placeholder.update(self, self.placeholder);
+
+ },
+
+ _contactContainers: function(event) {
+
+ // get innermost container that intersects with item
+ var innermostContainer = null, innermostIndex = null;
+
+
+ for (var i = this.containers.length - 1; i >= 0; i--){
+
+ // never consider a container that's located within the item itself
+ if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
+ continue;
+
+ if(this._intersectsWith(this.containers[i].containerCache)) {
+
+ // if we've already found a container and it's more "inner" than this, then continue
+ if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
+ continue;
+
+ innermostContainer = this.containers[i];
+ innermostIndex = i;
+
+ } else {
+ // container doesn't intersect. trigger "out" event if necessary
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", event, this._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ // if no intersecting containers found, return
+ if(!innermostContainer) return;
+
+ // move the item into the container if it's not there already
+ if(this.containers.length === 1) {
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ } else if(this.currentContainer != this.containers[innermostIndex]) {
+
+ //When entering a new container, we will find the item with the least distance and append our item near it
+ var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
+ for (var j = this.items.length - 1; j >= 0; j--) {
+ if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
+ var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top'];
+ if(Math.abs(cur - base) < dist) {
+ dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
+ }
+ }
+
+ if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
+ return;
+
+ this.currentContainer = this.containers[innermostIndex];
+ itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
+ this._trigger("change", event, this._uiHash());
+ this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
+
+ //Update the placeholder
+ this.options.placeholder.update(this.currentContainer, this.placeholder);
+
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ }
+
+
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options;
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
+
+ if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
+ $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+
+ if(helper[0] == this.currentItem[0])
+ this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
+
+ if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
+ if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
+
+ return helper;
+
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj == 'string') {
+ obj = obj.split(' ');
+ }
+ if ($.isArray(obj)) {
+ obj = {left: +obj[0], top: +obj[1] || 0};
+ }
+ if ('left' in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ('right' in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+ }
+ if ('top' in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ('bottom' in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+ }
+ },
+
+ _getParentOffset: function() {
+
+
+ //Get the offsetParent and cache its position
+ this.offsetParent = this.helper.offsetParent();
+ var po = this.offsetParent.offset();
+
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+ if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+ || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+ po = { top: 0, left: 0 };
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+
+ if(this.cssPosition == "relative") {
+ var p = this.currentItem.position();
+ return {
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+ };
+ } else {
+ return { top: 0, left: 0 };
+ }
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
+ top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var o = this.options;
+ if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+ if(o.containment == 'document' || o.containment == 'window') this.containment = [
+ 0 - this.offset.relative.left - this.offset.parent.left,
+ 0 - this.offset.relative.top - this.offset.parent.top,
+ $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+ ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+ ];
+
+ if(!(/^(document|window|parent)$/).test(o.containment)) {
+ var ce = $(o.containment)[0];
+ var co = $(o.containment).offset();
+ var over = ($(ce).css("overflow") != 'hidden');
+
+ this.containment = [
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+ ];
+ }
+
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if(!pos) pos = this.position;
+ var mod = d == "absolute" ? 1 : -1;
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ return {
+ top: (
+ pos.top // The absolute mouse position
+ + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+ ),
+ left: (
+ pos.left // The absolute mouse position
+ + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function(event) {
+
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ // This is another very weird special case that only happens for relative elements:
+ // 1. If the css position is relative
+ // 2. and the scroll parent is the document or similar to the offset parent
+ // we have to refresh the relative offset during the scroll so there are no jumps
+ if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
+ this.offset.relative = this._getRelativeOffset();
+ }
+
+ var pageX = event.pageX;
+ var pageY = event.pageY;
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+ if(this.containment) {
+ if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+ if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+ }
+
+ if(o.grid) {
+ var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+ pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+ var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+ pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ }
+
+ }
+
+ return {
+ top: (
+ pageY // The absolute mouse position
+ - this.offset.click.top // Click offset (relative to the element)
+ - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+ ),
+ left: (
+ pageX // The absolute mouse position
+ - this.offset.click.left // Click offset (relative to the element)
+ - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+ )
+ };
+
+ },
+
+ _rearrange: function(event, i, a, hardRefresh) {
+
+ a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
+
+ //Various things done here to improve the performance:
+ // 1. we create a setTimeout, that calls refreshPositions
+ // 2. on the instance, we have a counter variable, that get's higher after every append
+ // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
+ // 4. this lets only the last addition to the timeout stack through
+ this.counter = this.counter ? ++this.counter : 1;
+ var self = this, counter = this.counter;
+
+ window.setTimeout(function() {
+ if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
+ },0);
+
+ },
+
+ _clear: function(event, noPropagation) {
+
+ this.reverting = false;
+ // We delay all events that have to be triggered to after the point where the placeholder has been removed and
+ // everything else normalized again
+ var delayedTriggers = [], self = this;
+
+ // We first have to update the dom position of the actual currentItem
+ // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
+ if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem);
+ this._noFinalSort = null;
+
+ if(this.helper[0] == this.currentItem[0]) {
+ for(var i in this._storedCSS) {
+ if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
+ }
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ } else {
+ this.currentItem.show();
+ }
+
+ if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
+ if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
+ if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
+ if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ }
+ };
+ };
+
+ //Post events to containers
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ if(this.containers[i].containerCache.over) {
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ //Do what was originally in plugins
+ if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
+ if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
+ if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
+
+ this.dragging = false;
+ if(this.cancelHelperRemoval) {
+ if(!noPropagation) {
+ this._trigger("beforeStop", event, this._uiHash());
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+ this._trigger("stop", event, this._uiHash());
+ }
+ return false;
+ }
+
+ if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
+
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+
+ if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
+
+ if(!noPropagation) {
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+ this._trigger("stop", event, this._uiHash());
+ }
+
+ this.fromOutside = false;
+ return true;
+
+ },
+
+ _trigger: function() {
+ if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
+ this.cancel();
+ }
+ },
+
+ _uiHash: function(inst) {
+ var self = inst || this;
+ return {
+ helper: self.helper,
+ placeholder: self.placeholder || $([]),
+ position: self.position,
+ originalPosition: self.originalPosition,
+ offset: self.positionAbs,
+ item: self.currentItem,
+ sender: inst ? inst.element : null
+ };
+ }
+
+});
+
+$.extend($.ui.sortable, {
+ version: "1.8.10"
+});
+
+})(jQuery);
+/*
+ * jQuery UI Accordion 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.accordion", {
+ options: {
+ active: 0,
+ animated: "slide",
+ autoHeight: true,
+ clearStyle: false,
+ collapsible: false,
+ event: "click",
+ fillSpace: false,
+ header: "> li > :first-child,> :not(li):even",
+ icons: {
+ header: "ui-icon-triangle-1-e",
+ headerSelected: "ui-icon-triangle-1-s"
+ },
+ navigation: false,
+ navigationFilter: function() {
+ return this.href.toLowerCase() === location.href.toLowerCase();
+ }
+ },
+
+ _create: function() {
+ var self = this,
+ options = self.options;
+
+ self.running = 0;
+
+ self.element
+ .addClass( "ui-accordion ui-widget ui-helper-reset" )
+ // in lack of child-selectors in CSS
+ // we need to mark top-LIs in a UL-accordion for some IE-fix
+ .children( "li" )
+ .addClass( "ui-accordion-li-fix" );
+
+ self.headers = self.element.find( options.header )
+ .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
+ .bind( "mouseenter.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).addClass( "ui-state-hover" );
+ })
+ .bind( "mouseleave.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( "ui-state-hover" );
+ })
+ .bind( "focus.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).addClass( "ui-state-focus" );
+ })
+ .bind( "blur.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( "ui-state-focus" );
+ });
+
+ self.headers.next()
+ .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
+
+ if ( options.navigation ) {
+ var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
+ if ( current.length ) {
+ var header = current.closest( ".ui-accordion-header" );
+ if ( header.length ) {
+ // anchor within header
+ self.active = header;
+ } else {
+ // anchor within content
+ self.active = current.closest( ".ui-accordion-content" ).prev();
+ }
+ }
+ }
+
+ self.active = self._findActive( self.active || options.active )
+ .addClass( "ui-state-default ui-state-active" )
+ .toggleClass( "ui-corner-all" )
+ .toggleClass( "ui-corner-top" );
+ self.active.next().addClass( "ui-accordion-content-active" );
+
+ self._createIcons();
+ self.resize();
+
+ // ARIA
+ self.element.attr( "role", "tablist" );
+
+ self.headers
+ .attr( "role", "tab" )
+ .bind( "keydown.accordion", function( event ) {
+ return self._keydown( event );
+ })
+ .next()
+ .attr( "role", "tabpanel" );
+
+ self.headers
+ .not( self.active || "" )
+ .attr({
+ "aria-expanded": "false",
+ tabIndex: -1
+ })
+ .next()
+ .hide();
+
+ // make sure at least one header is in the tab order
+ if ( !self.active.length ) {
+ self.headers.eq( 0 ).attr( "tabIndex", 0 );
+ } else {
+ self.active
+ .attr({
+ "aria-expanded": "true",
+ tabIndex: 0
+ });
+ }
+
+ // only need links in tab order for Safari
+ if ( !$.browser.safari ) {
+ self.headers.find( "a" ).attr( "tabIndex", -1 );
+ }
+
+ if ( options.event ) {
+ self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
+ self._clickHandler.call( self, event, this );
+ event.preventDefault();
+ });
+ }
+ },
+
+ _createIcons: function() {
+ var options = this.options;
+ if ( options.icons ) {
+ $( "<span></span>" )
+ .addClass( "ui-icon " + options.icons.header )
+ .prependTo( this.headers );
+ this.active.children( ".ui-icon" )
+ .toggleClass(options.icons.header)
+ .toggleClass(options.icons.headerSelected);
+ this.element.addClass( "ui-accordion-icons" );
+ }
+ },
+
+ _destroyIcons: function() {
+ this.headers.children( ".ui-icon" ).remove();
+ this.element.removeClass( "ui-accordion-icons" );
+ },
+
+ destroy: function() {
+ var options = this.options;
+
+ this.element
+ .removeClass( "ui-accordion ui-widget ui-helper-reset" )
+ .removeAttr( "role" );
+
+ this.headers
+ .unbind( ".accordion" )
+ .removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-expanded" )
+ .removeAttr( "tabIndex" );
+
+ this.headers.find( "a" ).removeAttr( "tabIndex" );
+ this._destroyIcons();
+ var contents = this.headers.next()
+ .css( "display", "" )
+ .removeAttr( "role" )
+ .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
+ if ( options.autoHeight || options.fillHeight ) {
+ contents.css( "height", "" );
+ }
+
+ return $.Widget.prototype.destroy.call( this );
+ },
+
+ _setOption: function( key, value ) {
+ $.Widget.prototype._setOption.apply( this, arguments );
+
+ if ( key == "active" ) {
+ this.activate( value );
+ }
+ if ( key == "icons" ) {
+ this._destroyIcons();
+ if ( value ) {
+ this._createIcons();
+ }
+ }
+ // #5332 - opacity doesn't cascade to positioned elements in IE
+ // so we need to add the disabled class to the headers and panels
+ if ( key == "disabled" ) {
+ this.headers.add(this.headers.next())
+ [ value ? "addClass" : "removeClass" ](
+ "ui-accordion-disabled ui-state-disabled" );
+ }
+ },
+
+ _keydown: function( event ) {
+ if ( this.options.disabled || event.altKey || event.ctrlKey ) {
+ return;
+ }
+
+ var keyCode = $.ui.keyCode,
+ length = this.headers.length,
+ currentIndex = this.headers.index( event.target ),
+ toFocus = false;
+
+ switch ( event.keyCode ) {
+ case keyCode.RIGHT:
+ case keyCode.DOWN:
+ toFocus = this.headers[ ( currentIndex + 1 ) % length ];
+ break;
+ case keyCode.LEFT:
+ case keyCode.UP:
+ toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
+ break;
+ case keyCode.SPACE:
+ case keyCode.ENTER:
+ this._clickHandler( { target: event.target }, event.target );
+ event.preventDefault();
+ }
+
+ if ( toFocus ) {
+ $( event.target ).attr( "tabIndex", -1 );
+ $( toFocus ).attr( "tabIndex", 0 );
+ toFocus.focus();
+ return false;
+ }
+
+ return true;
+ },
+
+ resize: function() {
+ var options = this.options,
+ maxHeight;
+
+ if ( options.fillSpace ) {
+ if ( $.browser.msie ) {
+ var defOverflow = this.element.parent().css( "overflow" );
+ this.element.parent().css( "overflow", "hidden");
+ }
+ maxHeight = this.element.parent().height();
+ if ($.browser.msie) {
+ this.element.parent().css( "overflow", defOverflow );
+ }
+
+ this.headers.each(function() {
+ maxHeight -= $( this ).outerHeight( true );
+ });
+
+ this.headers.next()
+ .each(function() {
+ $( this ).height( Math.max( 0, maxHeight -
+ $( this ).innerHeight() + $( this ).height() ) );
+ })
+ .css( "overflow", "auto" );
+ } else if ( options.autoHeight ) {
+ maxHeight = 0;
+ this.headers.next()
+ .each(function() {
+ maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+ })
+ .height( maxHeight );
+ }
+
+ return this;
+ },
+
+ activate: function( index ) {
+ // TODO this gets called on init, changing the option without an explicit call for that
+ this.options.active = index;
+ // call clickHandler with custom event
+ var active = this._findActive( index )[ 0 ];
+ this._clickHandler( { target: active }, active );
+
+ return this;
+ },
+
+ _findActive: function( selector ) {
+ return selector
+ ? typeof selector === "number"
+ ? this.headers.filter( ":eq(" + selector + ")" )
+ : this.headers.not( this.headers.not( selector ) )
+ : selector === false
+ ? $( [] )
+ : this.headers.filter( ":eq(0)" );
+ },
+
+ // TODO isn't event.target enough? why the separate target argument?
+ _clickHandler: function( event, target ) {
+ var options = this.options;
+ if ( options.disabled ) {
+ return;
+ }
+
+ // called only when using activate(false) to close all parts programmatically
+ if ( !event.target ) {
+ if ( !options.collapsible ) {
+ return;
+ }
+ this.active
+ .removeClass( "ui-state-active ui-corner-top" )
+ .addClass( "ui-state-default ui-corner-all" )
+ .children( ".ui-icon" )
+ .removeClass( options.icons.headerSelected )
+ .addClass( options.icons.header );
+ this.active.next().addClass( "ui-accordion-content-active" );
+ var toHide = this.active.next(),
+ data = {
+ options: options,
+ newHeader: $( [] ),
+ oldHeader: options.active,
+ newContent: $( [] ),
+ oldContent: toHide
+ },
+ toShow = ( this.active = $( [] ) );
+ this._toggle( toShow, toHide, data );
+ return;
+ }
+
+ // get the click target
+ var clicked = $( event.currentTarget || target ),
+ clickedIsActive = clicked[0] === this.active[0];
+
+ // TODO the option is changed, is that correct?
+ // TODO if it is correct, shouldn't that happen after determining that the click is valid?
+ options.active = options.collapsible && clickedIsActive ?
+ false :
+ this.headers.index( clicked );
+
+ // if animations are still active, or the active header is the target, ignore click
+ if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
+ return;
+ }
+
+ // find elements to show and hide
+ var active = this.active,
+ toShow = clicked.next(),
+ toHide = this.active.next(),
+ data = {
+ options: options,
+ newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
+ oldHeader: this.active,
+ newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
+ oldContent: toHide
+ },
+ down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
+
+ // when the call to ._toggle() comes after the class changes
+ // it causes a very odd bug in IE 8 (see #6720)
+ this.active = clickedIsActive ? $([]) : clicked;
+ this._toggle( toShow, toHide, data, clickedIsActive, down );
+
+ // switch classes
+ active
+ .removeClass( "ui-state-active ui-corner-top" )
+ .addClass( "ui-state-default ui-corner-all" )
+ .children( ".ui-icon" )
+ .removeClass( options.icons.headerSelected )
+ .addClass( options.icons.header );
+ if ( !clickedIsActive ) {
+ clicked
+ .removeClass( "ui-state-default ui-corner-all" )
+ .addClass( "ui-state-active ui-corner-top" )
+ .children( ".ui-icon" )
+ .removeClass( options.icons.header )
+ .addClass( options.icons.headerSelected );
+ clicked
+ .next()
+ .addClass( "ui-accordion-content-active" );
+ }
+
+ return;
+ },
+
+ _toggle: function( toShow, toHide, data, clickedIsActive, down ) {
+ var self = this,
+ options = self.options;
+
+ self.toShow = toShow;
+ self.toHide = toHide;
+ self.data = data;
+
+ var complete = function() {
+ if ( !self ) {
+ return;
+ }
+ return self._completed.apply( self, arguments );
+ };
+
+ // trigger changestart event
+ self._trigger( "changestart", null, self.data );
+
+ // count elements to animate
+ self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
+
+ if ( options.animated ) {
+ var animOptions = {};
+
+ if ( options.collapsible && clickedIsActive ) {
+ animOptions = {
+ toShow: $( [] ),
+ toHide: toHide,
+ complete: complete,
+ down: down,
+ autoHeight: options.autoHeight || options.fillSpace
+ };
+ } else {
+ animOptions = {
+ toShow: toShow,
+ toHide: toHide,
+ complete: complete,
+ down: down,
+ autoHeight: options.autoHeight || options.fillSpace
+ };
+ }
+
+ if ( !options.proxied ) {
+ options.proxied = options.animated;
+ }
+
+ if ( !options.proxiedDuration ) {
+ options.proxiedDuration = options.duration;
+ }
+
+ options.animated = $.isFunction( options.proxied ) ?
+ options.proxied( animOptions ) :
+ options.proxied;
+
+ options.duration = $.isFunction( options.proxiedDuration ) ?
+ options.proxiedDuration( animOptions ) :
+ options.proxiedDuration;
+
+ var animations = $.ui.accordion.animations,
+ duration = options.duration,
+ easing = options.animated;
+
+ if ( easing && !animations[ easing ] && !$.easing[ easing ] ) {
+ easing = "slide";
+ }
+ if ( !animations[ easing ] ) {
+ animations[ easing ] = function( options ) {
+ this.slide( options, {
+ easing: easing,
+ duration: duration || 700
+ });
+ };
+ }
+
+ animations[ easing ]( animOptions );
+ } else {
+ if ( options.collapsible && clickedIsActive ) {
+ toShow.toggle();
+ } else {
+ toHide.hide();
+ toShow.show();
+ }
+
+ complete( true );
+ }
+
+ // TODO assert that the blur and focus triggers are really necessary, remove otherwise
+ toHide.prev()
+ .attr({
+ "aria-expanded": "false",
+ tabIndex: -1
+ })
+ .blur();
+ toShow.prev()
+ .attr({
+ "aria-expanded": "true",
+ tabIndex: 0
+ })
+ .focus();
+ },
+
+ _completed: function( cancel ) {
+ this.running = cancel ? 0 : --this.running;
+ if ( this.running ) {
+ return;
+ }
+
+ if ( this.options.clearStyle ) {
+ this.toShow.add( this.toHide ).css({
+ height: "",
+ overflow: ""
+ });
+ }
+
+ // other classes are removed before the animation; this one needs to stay until completed
+ this.toHide.removeClass( "ui-accordion-content-active" );
+ // Work around for rendering bug in IE (#5421)
+ if ( this.toHide.length ) {
+ this.toHide.parent()[0].className = this.toHide.parent()[0].className;
+ }
+
+ this._trigger( "change", null, this.data );
+ }
+});
+
+$.extend( $.ui.accordion, {
+ version: "1.8.10",
+ animations: {
+ slide: function( options, additions ) {
+ options = $.extend({
+ easing: "swing",
+ duration: 300
+ }, options, additions );
+ if ( !options.toHide.size() ) {
+ options.toShow.animate({
+ height: "show",
+ paddingTop: "show",
+ paddingBottom: "show"
+ }, options );
+ return;
+ }
+ if ( !options.toShow.size() ) {
+ options.toHide.animate({
+ height: "hide",
+ paddingTop: "hide",
+ paddingBottom: "hide"
+ }, options );
+ return;
+ }
+ var overflow = options.toShow.css( "overflow" ),
+ percentDone = 0,
+ showProps = {},
+ hideProps = {},
+ fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
+ originalWidth;
+ // fix width before calculating height of hidden element
+ var s = options.toShow;
+ originalWidth = s[0].style.width;
+ s.width( parseInt( s.parent().width(), 10 )
+ - parseInt( s.css( "paddingLeft" ), 10 )
+ - parseInt( s.css( "paddingRight" ), 10 )
+ - ( parseInt( s.css( "borderLeftWidth" ), 10 ) || 0 )
+ - ( parseInt( s.css( "borderRightWidth" ), 10) || 0 ) );
+
+ $.each( fxAttrs, function( i, prop ) {
+ hideProps[ prop ] = "hide";
+
+ var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ );
+ showProps[ prop ] = {
+ value: parts[ 1 ],
+ unit: parts[ 2 ] || "px"
+ };
+ });
+ options.toShow.css({ height: 0, overflow: "hidden" }).show();
+ options.toHide
+ .filter( ":hidden" )
+ .each( options.complete )
+ .end()
+ .filter( ":visible" )
+ .animate( hideProps, {
+ step: function( now, settings ) {
+ // only calculate the percent when animating height
+ // IE gets very inconsistent results when animating elements
+ // with small values, which is common for padding
+ if ( settings.prop == "height" ) {
+ percentDone = ( settings.end - settings.start === 0 ) ? 0 :
+ ( settings.now - settings.start ) / ( settings.end - settings.start );
+ }
+
+ options.toShow[ 0 ].style[ settings.prop ] =
+ ( percentDone * showProps[ settings.prop ].value )
+ + showProps[ settings.prop ].unit;
+ },
+ duration: options.duration,
+ easing: options.easing,
+ complete: function() {
+ if ( !options.autoHeight ) {
+ options.toShow.css( "height", "" );
+ }
+ options.toShow.css({
+ width: originalWidth,
+ overflow: overflow
+ });
+ options.complete();
+ }
+ });
+ },
+ bounceslide: function( options ) {
+ this.slide( options, {
+ easing: options.down ? "easeOutBounce" : "swing",
+ duration: options.down ? 1000 : 200
+ });
+ }
+ }
+});
+
+})( jQuery );
+/*
+ * jQuery UI Autocomplete 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.position.js
+ */
+(function( $, undefined ) {
+
+// used to prevent race conditions with remote data sources
+var requestIndex = 0;
+
+$.widget( "ui.autocomplete", {
+ options: {
+ appendTo: "body",
+ delay: 300,
+ minLength: 1,
+ position: {
+ my: "left top",
+ at: "left bottom",
+ collision: "none"
+ },
+ source: null
+ },
+
+ pending: 0,
+
+ _create: function() {
+ var self = this,
+ doc = this.element[ 0 ].ownerDocument,
+ suppressKeyPress;
+
+ this.element
+ .addClass( "ui-autocomplete-input" )
+ .attr( "autocomplete", "off" )
+ // TODO verify these actually work as intended
+ .attr({
+ role: "textbox",
+ "aria-autocomplete": "list",
+ "aria-haspopup": "true"
+ })
+ .bind( "keydown.autocomplete", function( event ) {
+ if ( self.options.disabled || self.element.attr( "readonly" ) ) {
+ return;
+ }
+
+ suppressKeyPress = false;
+ var keyCode = $.ui.keyCode;
+ switch( event.keyCode ) {
+ case keyCode.PAGE_UP:
+ self._move( "previousPage", event );
+ break;
+ case keyCode.PAGE_DOWN:
+ self._move( "nextPage", event );
+ break;
+ case keyCode.UP:
+ self._move( "previous", event );
+ // prevent moving cursor to beginning of text field in some browsers
+ event.preventDefault();
+ break;
+ case keyCode.DOWN:
+ self._move( "next", event );
+ // prevent moving cursor to end of text field in some browsers
+ event.preventDefault();
+ break;
+ case keyCode.ENTER:
+ case keyCode.NUMPAD_ENTER:
+ // when menu is open and has focus
+ if ( self.menu.active ) {
+ // #6055 - Opera still allows the keypress to occur
+ // which causes forms to submit
+ suppressKeyPress = true;
+ event.preventDefault();
+ }
+ //passthrough - ENTER and TAB both select the current element
+ case keyCode.TAB:
+ if ( !self.menu.active ) {
+ return;
+ }
+ self.menu.select( event );
+ break;
+ case keyCode.ESCAPE:
+ self.element.val( self.term );
+ self.close( event );
+ break;
+ default:
+ // keypress is triggered before the input value is changed
+ clearTimeout( self.searching );
+ self.searching = setTimeout(function() {
+ // only search if the value has changed
+ if ( self.term != self.element.val() ) {
+ self.selectedItem = null;
+ self.search( null, event );
+ }
+ }, self.options.delay );
+ break;
+ }
+ })
+ .bind( "keypress.autocomplete", function( event ) {
+ if ( suppressKeyPress ) {
+ suppressKeyPress = false;
+ event.preventDefault();
+ }
+ })
+ .bind( "focus.autocomplete", function() {
+ if ( self.options.disabled ) {
+ return;
+ }
+
+ self.selectedItem = null;
+ self.previous = self.element.val();
+ })
+ .bind( "blur.autocomplete", function( event ) {
+ if ( self.options.disabled ) {
+ return;
+ }
+
+ clearTimeout( self.searching );
+ // clicks on the menu (or a button to trigger a search) will cause a blur event
+ self.closing = setTimeout(function() {
+ self.close( event );
+ self._change( event );
+ }, 150 );
+ });
+ this._initSource();
+ this.response = function() {
+ return self._response.apply( self, arguments );
+ };
+ this.menu = $( "<ul></ul>" )
+ .addClass( "ui-autocomplete" )
+ .appendTo( $( this.options.appendTo || "body", doc )[0] )
+ // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
+ .mousedown(function( event ) {
+ // clicking on the scrollbar causes focus to shift to the body
+ // but we can't detect a mouseup or a click immediately afterward
+ // so we have to track the next mousedown and close the menu if
+ // the user clicks somewhere outside of the autocomplete
+ var menuElement = self.menu.element[ 0 ];
+ if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
+ setTimeout(function() {
+ $( document ).one( 'mousedown', function( event ) {
+ if ( event.target !== self.element[ 0 ] &&
+ event.target !== menuElement &&
+ !$.ui.contains( menuElement, event.target ) ) {
+ self.close();
+ }
+ });
+ }, 1 );
+ }
+
+ // use another timeout to make sure the blur-event-handler on the input was already triggered
+ setTimeout(function() {
+ clearTimeout( self.closing );
+ }, 13);
+ })
+ .menu({
+ focus: function( event, ui ) {
+ var item = ui.item.data( "item.autocomplete" );
+ if ( false !== self._trigger( "focus", event, { item: item } ) ) {
+ // use value to match what will end up in the input, if it was a key event
+ if ( /^key/.test(event.originalEvent.type) ) {
+ self.element.val( item.value );
+ }
+ }
+ },
+ selected: function( event, ui ) {
+ var item = ui.item.data( "item.autocomplete" ),
+ previous = self.previous;
+
+ // only trigger when focus was lost (click on menu)
+ if ( self.element[0] !== doc.activeElement ) {
+ self.element.focus();
+ self.previous = previous;
+ // #6109 - IE triggers two focus events and the second
+ // is asynchronous, so we need to reset the previous
+ // term synchronously and asynchronously :-(
+ setTimeout(function() {
+ self.previous = previous;
+ self.selectedItem = item;
+ }, 1);
+ }
+
+ if ( false !== self._trigger( "select", event, { item: item } ) ) {
+ self.element.val( item.value );
+ }
+ // reset the term after the select event
+ // this allows custom select handling to work properly
+ self.term = self.element.val();
+
+ self.close( event );
+ self.selectedItem = item;
+ },
+ blur: function( event, ui ) {
+ // don't set the value of the text field if it's already correct
+ // this prevents moving the cursor unnecessarily
+ if ( self.menu.element.is(":visible") &&
+ ( self.element.val() !== self.term ) ) {
+ self.element.val( self.term );
+ }
+ }
+ })
+ .zIndex( this.element.zIndex() + 1 )
+ // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+ .css({ top: 0, left: 0 })
+ .hide()
+ .data( "menu" );
+ if ( $.fn.bgiframe ) {
+ this.menu.element.bgiframe();
+ }
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-autocomplete-input" )
+ .removeAttr( "autocomplete" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-autocomplete" )
+ .removeAttr( "aria-haspopup" );
+ this.menu.element.remove();
+ $.Widget.prototype.destroy.call( this );
+ },
+
+ _setOption: function( key, value ) {
+ $.Widget.prototype._setOption.apply( this, arguments );
+ if ( key === "source" ) {
+ this._initSource();
+ }
+ if ( key === "appendTo" ) {
+ this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
+ }
+ if ( key === "disabled" && value && this.xhr ) {
+ this.xhr.abort();
+ }
+ },
+
+ _initSource: function() {
+ var self = this,
+ array,
+ url;
+ if ( $.isArray(this.options.source) ) {
+ array = this.options.source;
+ this.source = function( request, response ) {
+ response( $.ui.autocomplete.filter(array, request.term) );
+ };
+ } else if ( typeof this.options.source === "string" ) {
+ url = this.options.source;
+ this.source = function( request, response ) {
+ if ( self.xhr ) {
+ self.xhr.abort();
+ }
+ self.xhr = $.ajax({
+ url: url,
+ data: request,
+ dataType: "json",
+ autocompleteRequest: ++requestIndex,
+ success: function( data, status ) {
+ if ( this.autocompleteRequest === requestIndex ) {
+ response( data );
+ }
+ },
+ error: function() {
+ if ( this.autocompleteRequest === requestIndex ) {
+ response( [] );
+ }
+ }
+ });
+ };
+ } else {
+ this.source = this.options.source;
+ }
+ },
+
+ search: function( value, event ) {
+ value = value != null ? value : this.element.val();
+
+ // always save the actual value, not the one passed as an argument
+ this.term = this.element.val();
+
+ if ( value.length < this.options.minLength ) {
+ return this.close( event );
+ }
+
+ clearTimeout( this.closing );
+ if ( this._trigger( "search", event ) === false ) {
+ return;
+ }
+
+ return this._search( value );
+ },
+
+ _search: function( value ) {
+ this.pending++;
+ this.element.addClass( "ui-autocomplete-loading" );
+
+ this.source( { term: value }, this.response );
+ },
+
+ _response: function( content ) {
+ if ( !this.options.disabled && content && content.length ) {
+ content = this._normalize( content );
+ this._suggest( content );
+ this._trigger( "open" );
+ } else {
+ this.close();
+ }
+ this.pending--;
+ if ( !this.pending ) {
+ this.element.removeClass( "ui-autocomplete-loading" );
+ }
+ },
+
+ close: function( event ) {
+ clearTimeout( this.closing );
+ if ( this.menu.element.is(":visible") ) {
+ this.menu.element.hide();
+ this.menu.deactivate();
+ this._trigger( "close", event );
+ }
+ },
+
+ _change: function( event ) {
+ if ( this.previous !== this.element.val() ) {
+ this._trigger( "change", event, { item: this.selectedItem } );
+ }
+ },
+
+ _normalize: function( items ) {
+ // assume all items have the right format when the first item is complete
+ if ( items.length && items[0].label && items[0].value ) {
+ return items;
+ }
+ return $.map( items, function(item) {
+ if ( typeof item === "string" ) {
+ return {
+ label: item,
+ value: item
+ };
+ }
+ return $.extend({
+ label: item.label || item.value,
+ value: item.value || item.label
+ }, item );
+ });
+ },
+
+ _suggest: function( items ) {
+ var ul = this.menu.element
+ .empty()
+ .zIndex( this.element.zIndex() + 1 );
+ this._renderMenu( ul, items );
+ // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
+ this.menu.deactivate();
+ this.menu.refresh();
+
+ // size and position menu
+ ul.show();
+ this._resizeMenu();
+ ul.position( $.extend({
+ of: this.element
+ }, this.options.position ));
+ },
+
+ _resizeMenu: function() {
+ var ul = this.menu.element;
+ ul.outerWidth( Math.max(
+ ul.width( "" ).outerWidth(),
+ this.element.outerWidth()
+ ) );
+ },
+
+ _renderMenu: function( ul, items ) {
+ var self = this;
+ $.each( items, function( index, item ) {
+ self._renderItem( ul, item );
+ });
+ },
+
+ _renderItem: function( ul, item) {
+ return $( "<li></li>" )
+ .data( "item.autocomplete", item )
+ .append( $( "<a></a>" ).text( item.label ) )
+ .appendTo( ul );
+ },
+
+ _move: function( direction, event ) {
+ if ( !this.menu.element.is(":visible") ) {
+ this.search( null, event );
+ return;
+ }
+ if ( this.menu.first() && /^previous/.test(direction) ||
+ this.menu.last() && /^next/.test(direction) ) {
+ this.element.val( this.term );
+ this.menu.deactivate();
+ return;
+ }
+ this.menu[ direction ]( event );
+ },
+
+ widget: function() {
+ return this.menu.element;
+ }
+});
+
+$.extend( $.ui.autocomplete, {
+ escapeRegex: function( value ) {
+ return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+ },
+ filter: function(array, term) {
+ var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
+ return $.grep( array, function(value) {
+ return matcher.test( value.label || value.value || value );
+ });
+ }
+});
+
+}( jQuery ));
+
+/*
+ * jQuery UI Menu (not officially released)
+ *
+ * This widget isn't yet finished and the API is subject to change. We plan to finish
+ * it for the next release. You're welcome to give it a try anyway and give us feedback,
+ * as long as you're okay with migrating your code later on. We can help with that, too.
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.menu", {
+ _create: function() {
+ var self = this;
+ this.element
+ .addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
+ .attr({
+ role: "listbox",
+ "aria-activedescendant": "ui-active-menuitem"
+ })
+ .click(function( event ) {
+ if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
+ return;
+ }
+ // temporary
+ event.preventDefault();
+ self.select( event );
+ });
+ this.refresh();
+ },
+
+ refresh: function() {
+ var self = this;
+
+ // don't refresh list items that are already adapted
+ var items = this.element.children("li:not(.ui-menu-item):has(a)")
+ .addClass("ui-menu-item")
+ .attr("role", "menuitem");
+
+ items.children("a")
+ .addClass("ui-corner-all")
+ .attr("tabindex", -1)
+ // mouseenter doesn't work with event delegation
+ .mouseenter(function( event ) {
+ self.activate( event, $(this).parent() );
+ })
+ .mouseleave(function() {
+ self.deactivate();
+ });
+ },
+
+ activate: function( event, item ) {
+ this.deactivate();
+ if (this.hasScroll()) {
+ var offset = item.offset().top - this.element.offset().top,
+ scroll = this.element.attr("scrollTop"),
+ elementHeight = this.element.height();
+ if (offset < 0) {
+ this.element.attr("scrollTop", scroll + offset);
+ } else if (offset >= elementHeight) {
+ this.element.attr("scrollTop", scroll + offset - elementHeight + item.height());
+ }
+ }
+ this.active = item.eq(0)
+ .children("a")
+ .addClass("ui-state-hover")
+ .attr("id", "ui-active-menuitem")
+ .end();
+ this._trigger("focus", event, { item: item });
+ },
+
+ deactivate: function() {
+ if (!this.active) { return; }
+
+ this.active.children("a")
+ .removeClass("ui-state-hover")
+ .removeAttr("id");
+ this._trigger("blur");
+ this.active = null;
+ },
+
+ next: function(event) {
+ this.move("next", ".ui-menu-item:first", event);
+ },
+
+ previous: function(event) {
+ this.move("prev", ".ui-menu-item:last", event);
+ },
+
+ first: function() {
+ return this.active && !this.active.prevAll(".ui-menu-item").length;
+ },
+
+ last: function() {
+ return this.active && !this.active.nextAll(".ui-menu-item").length;
+ },
+
+ move: function(direction, edge, event) {
+ if (!this.active) {
+ this.activate(event, this.element.children(edge));
+ return;
+ }
+ var next = this.active[direction + "All"](".ui-menu-item").eq(0);
+ if (next.length) {
+ this.activate(event, next);
+ } else {
+ this.activate(event, this.element.children(edge));
+ }
+ },
+
+ // TODO merge with previousPage
+ nextPage: function(event) {
+ if (this.hasScroll()) {
+ // TODO merge with no-scroll-else
+ if (!this.active || this.last()) {
+ this.activate(event, this.element.children(".ui-menu-item:first"));
+ return;
+ }
+ var base = this.active.offset().top,
+ height = this.element.height(),
+ result = this.element.children(".ui-menu-item").filter(function() {
+ var close = $(this).offset().top - base - height + $(this).height();
+ // TODO improve approximation
+ return close < 10 && close > -10;
+ });
+
+ // TODO try to catch this earlier when scrollTop indicates the last page anyway
+ if (!result.length) {
+ result = this.element.children(".ui-menu-item:last");
+ }
+ this.activate(event, result);
+ } else {
+ this.activate(event, this.element.children(".ui-menu-item")
+ .filter(!this.active || this.last() ? ":first" : ":last"));
+ }
+ },
+
+ // TODO merge with nextPage
+ previousPage: function(event) {
+ if (this.hasScroll()) {
+ // TODO merge with no-scroll-else
+ if (!this.active || this.first()) {
+ this.activate(event, this.element.children(".ui-menu-item:last"));
+ return;
+ }
+
+ var base = this.active.offset().top,
+ height = this.element.height();
+ result = this.element.children(".ui-menu-item").filter(function() {
+ var close = $(this).offset().top - base + height - $(this).height();
+ // TODO improve approximation
+ return close < 10 && close > -10;
+ });
+
+ // TODO try to catch this earlier when scrollTop indicates the last page anyway
+ if (!result.length) {
+ result = this.element.children(".ui-menu-item:first");
+ }
+ this.activate(event, result);
+ } else {
+ this.activate(event, this.element.children(".ui-menu-item")
+ .filter(!this.active || this.first() ? ":last" : ":first"));
+ }
+ },
+
+ hasScroll: function() {
+ return this.element.height() < this.element.attr("scrollHeight");
+ },
+
+ select: function( event ) {
+ this._trigger("selected", event, { item: this.active });
+ }
+});
+
+}(jQuery));
+/*
+ * jQuery UI Button 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var lastActive,
+ baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
+ stateClasses = "ui-state-hover ui-state-active ",
+ typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
+ formResetHandler = function( event ) {
+ $( ":ui-button", event.target.form ).each(function() {
+ var inst = $( this ).data( "button" );
+ setTimeout(function() {
+ inst.refresh();
+ }, 1 );
+ });
+ },
+ radioGroup = function( radio ) {
+ var name = radio.name,
+ form = radio.form,
+ radios = $( [] );
+ if ( name ) {
+ if ( form ) {
+ radios = $( form ).find( "[name='" + name + "']" );
+ } else {
+ radios = $( "[name='" + name + "']", radio.ownerDocument )
+ .filter(function() {
+ return !this.form;
+ });
+ }
+ }
+ return radios;
+ };
+
+$.widget( "ui.button", {
+ options: {
+ disabled: null,
+ text: true,
+ label: null,
+ icons: {
+ primary: null,
+ secondary: null
+ }
+ },
+ _create: function() {
+ this.element.closest( "form" )
+ .unbind( "reset.button" )
+ .bind( "reset.button", formResetHandler );
+
+ if ( typeof this.options.disabled !== "boolean" ) {
+ this.options.disabled = this.element.attr( "disabled" );
+ }
+
+ this._determineButtonType();
+ this.hasTitle = !!this.buttonElement.attr( "title" );
+
+ var self = this,
+ options = this.options,
+ toggleButton = this.type === "checkbox" || this.type === "radio",
+ hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
+ focusClass = "ui-state-focus";
+
+ if ( options.label === null ) {
+ options.label = this.buttonElement.html();
+ }
+
+ if ( this.element.is( ":disabled" ) ) {
+ options.disabled = true;
+ }
+
+ this.buttonElement
+ .addClass( baseClasses )
+ .attr( "role", "button" )
+ .bind( "mouseenter.button", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).addClass( "ui-state-hover" );
+ if ( this === lastActive ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ .bind( "mouseleave.button", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( hoverClass );
+ })
+ .bind( "focus.button", function() {
+ // no need to check disabled, focus won't be triggered anyway
+ $( this ).addClass( focusClass );
+ })
+ .bind( "blur.button", function() {
+ $( this ).removeClass( focusClass );
+ });
+
+ if ( toggleButton ) {
+ this.element.bind( "change.button", function() {
+ self.refresh();
+ });
+ }
+
+ if ( this.type === "checkbox" ) {
+ this.buttonElement.bind( "click.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).toggleClass( "ui-state-active" );
+ self.buttonElement.attr( "aria-pressed", self.element[0].checked );
+ });
+ } else if ( this.type === "radio" ) {
+ this.buttonElement.bind( "click.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ self.buttonElement.attr( "aria-pressed", true );
+
+ var radio = self.element[ 0 ];
+ radioGroup( radio )
+ .not( radio )
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", false );
+ });
+ } else {
+ this.buttonElement
+ .bind( "mousedown.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ lastActive = this;
+ $( document ).one( "mouseup", function() {
+ lastActive = null;
+ });
+ })
+ .bind( "mouseup.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).removeClass( "ui-state-active" );
+ })
+ .bind( "keydown.button", function(event) {
+ if ( options.disabled ) {
+ return false;
+ }
+ if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ .bind( "keyup.button", function() {
+ $( this ).removeClass( "ui-state-active" );
+ });
+
+ if ( this.buttonElement.is("a") ) {
+ this.buttonElement.keyup(function(event) {
+ if ( event.keyCode === $.ui.keyCode.SPACE ) {
+ // TODO pass through original event correctly (just as 2nd argument doesn't work)
+ $( this ).click();
+ }
+ });
+ }
+ }
+
+ // TODO: pull out $.Widget's handling for the disabled option into
+ // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
+ // be overridden by individual plugins
+ this._setOption( "disabled", options.disabled );
+ },
+
+ _determineButtonType: function() {
+
+ if ( this.element.is(":checkbox") ) {
+ this.type = "checkbox";
+ } else {
+ if ( this.element.is(":radio") ) {
+ this.type = "radio";
+ } else {
+ if ( this.element.is("input") ) {
+ this.type = "input";
+ } else {
+ this.type = "button";
+ }
+ }
+ }
+
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ // we don't search against the document in case the element
+ // is disconnected from the DOM
+ this.buttonElement = this.element.parents().last()
+ .find( "label[for=" + this.element.attr("id") + "]" );
+ this.element.addClass( "ui-helper-hidden-accessible" );
+
+ var checked = this.element.is( ":checked" );
+ if ( checked ) {
+ this.buttonElement.addClass( "ui-state-active" );
+ }
+ this.buttonElement.attr( "aria-pressed", checked );
+ } else {
+ this.buttonElement = this.element;
+ }
+ },
+
+ widget: function() {
+ return this.buttonElement;
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-helper-hidden-accessible" );
+ this.buttonElement
+ .removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
+ .removeAttr( "role" )
+ .removeAttr( "aria-pressed" )
+ .html( this.buttonElement.find(".ui-button-text").html() );
+
+ if ( !this.hasTitle ) {
+ this.buttonElement.removeAttr( "title" );
+ }
+
+ $.Widget.prototype.destroy.call( this );
+ },
+
+ _setOption: function( key, value ) {
+ $.Widget.prototype._setOption.apply( this, arguments );
+ if ( key === "disabled" ) {
+ if ( value ) {
+ this.element.attr( "disabled", true );
+ } else {
+ this.element.removeAttr( "disabled" );
+ }
+ }
+ this._resetButton();
+ },
+
+ refresh: function() {
+ var isDisabled = this.element.is( ":disabled" );
+ if ( isDisabled !== this.options.disabled ) {
+ this._setOption( "disabled", isDisabled );
+ }
+ if ( this.type === "radio" ) {
+ radioGroup( this.element[0] ).each(function() {
+ if ( $( this ).is( ":checked" ) ) {
+ $( this ).button( "widget" )
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", true );
+ } else {
+ $( this ).button( "widget" )
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", false );
+ }
+ });
+ } else if ( this.type === "checkbox" ) {
+ if ( this.element.is( ":checked" ) ) {
+ this.buttonElement
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", true );
+ } else {
+ this.buttonElement
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", false );
+ }
+ }
+ },
+
+ _resetButton: function() {
+ if ( this.type === "input" ) {
+ if ( this.options.label ) {
+ this.element.val( this.options.label );
+ }
+ return;
+ }
+ var buttonElement = this.buttonElement.removeClass( typeClasses ),
+ buttonText = $( "<span></span>" )
+ .addClass( "ui-button-text" )
+ .html( this.options.label )
+ .appendTo( buttonElement.empty() )
+ .text(),
+ icons = this.options.icons,
+ multipleIcons = icons.primary && icons.secondary,
+ buttonClasses = [];
+
+ if ( icons.primary || icons.secondary ) {
+ buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
+
+ if ( icons.primary ) {
+ buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
+ }
+
+ if ( icons.secondary ) {
+ buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
+ }
+
+ if ( !this.options.text ) {
+ buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
+ buttonElement.removeClass( "ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary" );
+
+ if ( !this.hasTitle ) {
+ buttonElement.attr( "title", buttonText );
+ }
+ }
+ } else {
+ buttonClasses.push( "ui-button-text-only" );
+ }
+ buttonElement.addClass( buttonClasses.join( " " ) );
+ }
+});
+
+$.widget( "ui.buttonset", {
+ options: {
+ items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
+ },
+
+ _create: function() {
+ this.element.addClass( "ui-buttonset" );
+ },
+
+ _init: function() {
+ this.refresh();
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "disabled" ) {
+ this.buttons.button( "option", key, value );
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+ },
+
+ refresh: function() {
+ this.buttons = this.element.find( this.options.items )
+ .filter( ":ui-button" )
+ .button( "refresh" )
+ .end()
+ .not( ":ui-button" )
+ .button()
+ .end()
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+ .filter( ":first" )
+ .addClass( "ui-corner-left" )
+ .end()
+ .filter( ":last" )
+ .addClass( "ui-corner-right" )
+ .end()
+ .end();
+ },
+
+ destroy: function() {
+ this.element.removeClass( "ui-buttonset" );
+ this.buttons
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-left ui-corner-right" )
+ .end()
+ .button( "destroy" );
+
+ $.Widget.prototype.destroy.call( this );
+ }
+});
+
+}( jQuery ) );
+/*
+ * jQuery UI Dialog 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.button.js
+ * jquery.ui.draggable.js
+ * jquery.ui.mouse.js
+ * jquery.ui.position.js
+ * jquery.ui.resizable.js
+ */
+(function( $, undefined ) {
+
+var uiDialogClasses =
+ 'ui-dialog ' +
+ 'ui-widget ' +
+ 'ui-widget-content ' +
+ 'ui-corner-all ',
+ sizeRelatedOptions = {
+ buttons: true,
+ height: true,
+ maxHeight: true,
+ maxWidth: true,
+ minHeight: true,
+ minWidth: true,
+ width: true
+ },
+ resizableRelatedOptions = {
+ maxHeight: true,
+ maxWidth: true,
+ minHeight: true,
+ minWidth: true
+ };
+
+$.widget("ui.dialog", {
+ options: {
+ autoOpen: true,
+ buttons: {},
+ closeOnEscape: true,
+ closeText: 'close',
+ dialogClass: '',
+ draggable: true,
+ hide: null,
+ height: 'auto',
+ maxHeight: false,
+ maxWidth: false,
+ minHeight: 150,
+ minWidth: 150,
+ modal: false,
+ position: {
+ my: 'center',
+ at: 'center',
+ collision: 'fit',
+ // ensure that the titlebar is never outside the document
+ using: function(pos) {
+ var topOffset = $(this).css(pos).offset().top;
+ if (topOffset < 0) {
+ $(this).css('top', pos.top - topOffset);
+ }
+ }
+ },
+ resizable: true,
+ show: null,
+ stack: true,
+ title: '',
+ width: 300,
+ zIndex: 1000
+ },
+
+ _create: function() {
+ this.originalTitle = this.element.attr('title');
+ // #5742 - .attr() might return a DOMElement
+ if ( typeof this.originalTitle !== "string" ) {
+ this.originalTitle = "";
+ }
+
+ this.options.title = this.options.title || this.originalTitle;
+ var self = this,
+ options = self.options,
+
+ title = options.title || ' ',
+ titleId = $.ui.dialog.getTitleId(self.element),
+
+ uiDialog = (self.uiDialog = $('<div></div>'))
+ .appendTo(document.body)
+ .hide()
+ .addClass(uiDialogClasses + options.dialogClass)
+ .css({
+ zIndex: options.zIndex
+ })
+ // setting tabIndex makes the div focusable
+ // setting outline to 0 prevents a border on focus in Mozilla
+ .attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
+ if (options.closeOnEscape && event.keyCode &&
+ event.keyCode === $.ui.keyCode.ESCAPE) {
+
+ self.close(event);
+ event.preventDefault();
+ }
+ })
+ .attr({
+ role: 'dialog',
+ 'aria-labelledby': titleId
+ })
+ .mousedown(function(event) {
+ self.moveToTop(false, event);
+ }),
+
+ uiDialogContent = self.element
+ .show()
+ .removeAttr('title')
+ .addClass(
+ 'ui-dialog-content ' +
+ 'ui-widget-content')
+ .appendTo(uiDialog),
+
+ uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
+ .addClass(
+ 'ui-dialog-titlebar ' +
+ 'ui-widget-header ' +
+ 'ui-corner-all ' +
+ 'ui-helper-clearfix'
+ )
+ .prependTo(uiDialog),
+
+ uiDialogTitlebarClose = $('<a href="#"></a>')
+ .addClass(
+ 'ui-dialog-titlebar-close ' +
+ 'ui-corner-all'
+ )
+ .attr('role', 'button')
+ .hover(
+ function() {
+ uiDialogTitlebarClose.addClass('ui-state-hover');
+ },
+ function() {
+ uiDialogTitlebarClose.removeClass('ui-state-hover');
+ }
+ )
+ .focus(function() {
+ uiDialogTitlebarClose.addClass('ui-state-focus');
+ })
+ .blur(function() {
+ uiDialogTitlebarClose.removeClass('ui-state-focus');
+ })
+ .click(function(event) {
+ self.close(event);
+ return false;
+ })
+ .appendTo(uiDialogTitlebar),
+
+ uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
+ .addClass(
+ 'ui-icon ' +
+ 'ui-icon-closethick'
+ )
+ .text(options.closeText)
+ .appendTo(uiDialogTitlebarClose),
+
+ uiDialogTitle = $('<span></span>')
+ .addClass('ui-dialog-title')
+ .attr('id', titleId)
+ .html(title)
+ .prependTo(uiDialogTitlebar);
+
+ //handling of deprecated beforeclose (vs beforeClose) option
+ //Ticket #4669 http://dev.jqueryui.com/ticket/4669
+ //TODO: remove in 1.9pre
+ if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
+ options.beforeClose = options.beforeclose;
+ }
+
+ uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
+
+ if (options.draggable && $.fn.draggable) {
+ self._makeDraggable();
+ }
+ if (options.resizable && $.fn.resizable) {
+ self._makeResizable();
+ }
+
+ self._createButtons(options.buttons);
+ self._isOpen = false;
+
+ if ($.fn.bgiframe) {
+ uiDialog.bgiframe();
+ }
+ },
+
+ _init: function() {
+ if ( this.options.autoOpen ) {
+ this.open();
+ }
+ },
+
+ destroy: function() {
+ var self = this;
+
+ if (self.overlay) {
+ self.overlay.destroy();
+ }
+ self.uiDialog.hide();
+ self.element
+ .unbind('.dialog')
+ .removeData('dialog')
+ .removeClass('ui-dialog-content ui-widget-content')
+ .hide().appendTo('body');
+ self.uiDialog.remove();
+
+ if (self.originalTitle) {
+ self.element.attr('title', self.originalTitle);
+ }
+
+ return self;
+ },
+
+ widget: function() {
+ return this.uiDialog;
+ },
+
+ close: function(event) {
+ var self = this,
+ maxZ, thisZ;
+
+ if (false === self._trigger('beforeClose', event)) {
+ return;
+ }
+
+ if (self.overlay) {
+ self.overlay.destroy();
+ }
+ self.uiDialog.unbind('keypress.ui-dialog');
+
+ self._isOpen = false;
+
+ if (self.options.hide) {
+ self.uiDialog.hide(self.options.hide, function() {
+ self._trigger('close', event);
+ });
+ } else {
+ self.uiDialog.hide();
+ self._trigger('close', event);
+ }
+
+ $.ui.dialog.overlay.resize();
+
+ // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+ if (self.options.modal) {
+ maxZ = 0;
+ $('.ui-dialog').each(function() {
+ if (this !== self.uiDialog[0]) {
+ thisZ = $(this).css('z-index');
+ if(!isNaN(thisZ)) {
+ maxZ = Math.max(maxZ, thisZ);
+ }
+ }
+ });
+ $.ui.dialog.maxZ = maxZ;
+ }
+
+ return self;
+ },
+
+ isOpen: function() {
+ return this._isOpen;
+ },
+
+ // the force parameter allows us to move modal dialogs to their correct
+ // position on open
+ moveToTop: function(force, event) {
+ var self = this,
+ options = self.options,
+ saveScroll;
+
+ if ((options.modal && !force) ||
+ (!options.stack && !options.modal)) {
+ return self._trigger('focus', event);
+ }
+
+ if (options.zIndex > $.ui.dialog.maxZ) {
+ $.ui.dialog.maxZ = options.zIndex;
+ }
+ if (self.overlay) {
+ $.ui.dialog.maxZ += 1;
+ self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
+ }
+
+ //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
+ // http://ui.jquery.com/bugs/ticket/3193
+ saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') };
+ $.ui.dialog.maxZ += 1;
+ self.uiDialog.css('z-index', $.ui.dialog.maxZ);
+ self.element.attr(saveScroll);
+ self._trigger('focus', event);
+
+ return self;
+ },
+
+ open: function() {
+ if (this._isOpen) { return; }
+
+ var self = this,
+ options = self.options,
+ uiDialog = self.uiDialog;
+
+ self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
+ self._size();
+ self._position(options.position);
+ uiDialog.show(options.show);
+ self.moveToTop(true);
+
+ // prevent tabbing out of modal dialogs
+ if (options.modal) {
+ uiDialog.bind('keypress.ui-dialog', function(event) {
+ if (event.keyCode !== $.ui.keyCode.TAB) {
+ return;
+ }
+
+ var tabbables = $(':tabbable', this),
+ first = tabbables.filter(':first'),
+ last = tabbables.filter(':last');
+
+ if (event.target === last[0] && !event.shiftKey) {
+ first.focus(1);
+ return false;
+ } else if (event.target === first[0] && event.shiftKey) {
+ last.focus(1);
+ return false;
+ }
+ });
+ }
+
+ // set focus to the first tabbable element in the content area or the first button
+ // if there are no tabbable elements, set focus on the dialog itself
+ $(self.element.find(':tabbable').get().concat(
+ uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
+ uiDialog.get()))).eq(0).focus();
+
+ self._isOpen = true;
+ self._trigger('open');
+
+ return self;
+ },
+
+ _createButtons: function(buttons) {
+ var self = this,
+ hasButtons = false,
+ uiDialogButtonPane = $('<div></div>')
+ .addClass(
+ 'ui-dialog-buttonpane ' +
+ 'ui-widget-content ' +
+ 'ui-helper-clearfix'
+ ),
+ uiButtonSet = $( "<div></div>" )
+ .addClass( "ui-dialog-buttonset" )
+ .appendTo( uiDialogButtonPane );
+
+ // if we already have a button pane, remove it
+ self.uiDialog.find('.ui-dialog-buttonpane').remove();
+
+ if (typeof buttons === 'object' && buttons !== null) {
+ $.each(buttons, function() {
+ return !(hasButtons = true);
+ });
+ }
+ if (hasButtons) {
+ $.each(buttons, function(name, props) {
+ props = $.isFunction( props ) ?
+ { click: props, text: name } :
+ props;
+ var button = $('<button type="button"></button>')
+ .attr( props, true )
+ .unbind('click')
+ .click(function() {
+ props.click.apply(self.element[0], arguments);
+ })
+ .appendTo(uiButtonSet);
+ if ($.fn.button) {
+ button.button();
+ }
+ });
+ uiDialogButtonPane.appendTo(self.uiDialog);
+ }
+ },
+
+ _makeDraggable: function() {
+ var self = this,
+ options = self.options,
+ doc = $(document),
+ heightBeforeDrag;
+
+ function filteredUi(ui) {
+ return {
+ position: ui.position,
+ offset: ui.offset
+ };
+ }
+
+ self.uiDialog.draggable({
+ cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
+ handle: '.ui-dialog-titlebar',
+ containment: 'document',
+ start: function(event, ui) {
+ heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
+ $(this).height($(this).height()).addClass("ui-dialog-dragging");
+ self._trigger('dragStart', event, filteredUi(ui));
+ },
+ drag: function(event, ui) {
+ self._trigger('drag', event, filteredUi(ui));
+ },
+ stop: function(event, ui) {
+ options.position = [ui.position.left - doc.scrollLeft(),
+ ui.position.top - doc.scrollTop()];
+ $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
+ self._trigger('dragStop', event, filteredUi(ui));
+ $.ui.dialog.overlay.resize();
+ }
+ });
+ },
+
+ _makeResizable: function(handles) {
+ handles = (handles === undefined ? this.options.resizable : handles);
+ var self = this,
+ options = self.options,
+ // .ui-resizable has position: relative defined in the stylesheet
+ // but dialogs have to use absolute or fixed positioning
+ position = self.uiDialog.css('position'),
+ resizeHandles = (typeof handles === 'string' ?
+ handles :
+ 'n,e,s,w,se,sw,ne,nw'
+ );
+
+ function filteredUi(ui) {
+ return {
+ originalPosition: ui.originalPosition,
+ originalSize: ui.originalSize,
+ position: ui.position,
+ size: ui.size
+ };
+ }
+
+ self.uiDialog.resizable({
+ cancel: '.ui-dialog-content',
+ containment: 'document',
+ alsoResize: self.element,
+ maxWidth: options.maxWidth,
+ maxHeight: options.maxHeight,
+ minWidth: options.minWidth,
+ minHeight: self._minHeight(),
+ handles: resizeHandles,
+ start: function(event, ui) {
+ $(this).addClass("ui-dialog-resizing");
+ self._trigger('resizeStart', event, filteredUi(ui));
+ },
+ resize: function(event, ui) {
+ self._trigger('resize', event, filteredUi(ui));
+ },
+ stop: function(event, ui) {
+ $(this).removeClass("ui-dialog-resizing");
+ options.height = $(this).height();
+ options.width = $(this).width();
+ self._trigger('resizeStop', event, filteredUi(ui));
+ $.ui.dialog.overlay.resize();
+ }
+ })
+ .css('position', position)
+ .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+ },
+
+ _minHeight: function() {
+ var options = this.options;
+
+ if (options.height === 'auto') {
+ return options.minHeight;
+ } else {
+ return Math.min(options.minHeight, options.height);
+ }
+ },
+
+ _position: function(position) {
+ var myAt = [],
+ offset = [0, 0],
+ isVisible;
+
+ if (position) {
+ // deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
+ // if (typeof position == 'string' || $.isArray(position)) {
+ // myAt = $.isArray(position) ? position : position.split(' ');
+
+ if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
+ myAt = position.split ? position.split(' ') : [position[0], position[1]];
+ if (myAt.length === 1) {
+ myAt[1] = myAt[0];
+ }
+
+ $.each(['left', 'top'], function(i, offsetPosition) {
+ if (+myAt[i] === myAt[i]) {
+ offset[i] = myAt[i];
+ myAt[i] = offsetPosition;
+ }
+ });
+
+ position = {
+ my: myAt.join(" "),
+ at: myAt.join(" "),
+ offset: offset.join(" ")
+ };
+ }
+
+ position = $.extend({}, $.ui.dialog.prototype.options.position, position);
+ } else {
+ position = $.ui.dialog.prototype.options.position;
+ }
+
+ // need to show the dialog to get the actual offset in the position plugin
+ isVisible = this.uiDialog.is(':visible');
+ if (!isVisible) {
+ this.uiDialog.show();
+ }
+ this.uiDialog
+ // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+ .css({ top: 0, left: 0 })
+ .position($.extend({ of: window }, position));
+ if (!isVisible) {
+ this.uiDialog.hide();
+ }
+ },
+
+ _setOptions: function( options ) {
+ var self = this,
+ resizableOptions = {},
+ resize = false;
+
+ $.each( options, function( key, value ) {
+ self._setOption( key, value );
+
+ if ( key in sizeRelatedOptions ) {
+ resize = true;
+ }
+ if ( key in resizableRelatedOptions ) {
+ resizableOptions[ key ] = value;
+ }
+ });
+
+ if ( resize ) {
+ this._size();
+ }
+ if ( this.uiDialog.is( ":data(resizable)" ) ) {
+ this.uiDialog.resizable( "option", resizableOptions );
+ }
+ },
+
+ _setOption: function(key, value){
+ var self = this,
+ uiDialog = self.uiDialog;
+
+ switch (key) {
+ //handling of deprecated beforeclose (vs beforeClose) option
+ //Ticket #4669 http://dev.jqueryui.com/ticket/4669
+ //TODO: remove in 1.9pre
+ case "beforeclose":
+ key = "beforeClose";
+ break;
+ case "buttons":
+ self._createButtons(value);
+ break;
+ case "closeText":
+ // ensure that we always pass a string
+ self.uiDialogTitlebarCloseText.text("" + value);
+ break;
+ case "dialogClass":
+ uiDialog
+ .removeClass(self.options.dialogClass)
+ .addClass(uiDialogClasses + value);
+ break;
+ case "disabled":
+ if (value) {
+ uiDialog.addClass('ui-dialog-disabled');
+ } else {
+ uiDialog.removeClass('ui-dialog-disabled');
+ }
+ break;
+ case "draggable":
+ var isDraggable = uiDialog.is( ":data(draggable)" );
+ if ( isDraggable && !value ) {
+ uiDialog.draggable( "destroy" );
+ }
+
+ if ( !isDraggable && value ) {
+ self._makeDraggable();
+ }
+ break;
+ case "position":
+ self._position(value);
+ break;
+ case "resizable":
+ // currently resizable, becoming non-resizable
+ var isResizable = uiDialog.is( ":data(resizable)" );
+ if (isResizable && !value) {
+ uiDialog.resizable('destroy');
+ }
+
+ // currently resizable, changing handles
+ if (isResizable && typeof value === 'string') {
+ uiDialog.resizable('option', 'handles', value);
+ }
+
+ // currently non-resizable, becoming resizable
+ if (!isResizable && value !== false) {
+ self._makeResizable(value);
+ }
+ break;
+ case "title":
+ // convert whatever was passed in o a string, for html() to not throw up
+ $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || ' '));
+ break;
+ }
+
+ $.Widget.prototype._setOption.apply(self, arguments);
+ },
+
+ _size: function() {
+ /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+ * divs will both have width and height set, so we need to reset them
+ */
+ var options = this.options,
+ nonContentHeight,
+ minContentHeight,
+ isVisible = this.uiDialog.is( ":visible" );
+
+ // reset content sizing
+ this.element.show().css({
+ width: 'auto',
+ minHeight: 0,
+ height: 0
+ });
+
+ if (options.minWidth > options.width) {
+ options.width = options.minWidth;
+ }
+
+ // reset wrapper sizing
+ // determine the height of all the non-content elements
+ nonContentHeight = this.uiDialog.css({
+ height: 'auto',
+ width: options.width
+ })
+ .height();
+ minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
+
+ if ( options.height === "auto" ) {
+ // only needed for IE6 support
+ if ( $.support.minHeight ) {
+ this.element.css({
+ minHeight: minContentHeight,
+ height: "auto"
+ });
+ } else {
+ this.uiDialog.show();
+ var autoHeight = this.element.css( "height", "auto" ).height();
+ if ( !isVisible ) {
+ this.uiDialog.hide();
+ }
+ this.element.height( Math.max( autoHeight, minContentHeight ) );
+ }
+ } else {
+ this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
+ }
+
+ if (this.uiDialog.is(':data(resizable)')) {
+ this.uiDialog.resizable('option', 'minHeight', this._minHeight());
+ }
+ }
+});
+
+$.extend($.ui.dialog, {
+ version: "1.8.10",
+
+ uuid: 0,
+ maxZ: 0,
+
+ getTitleId: function($el) {
+ var id = $el.attr('id');
+ if (!id) {
+ this.uuid += 1;
+ id = this.uuid;
+ }
+ return 'ui-dialog-title-' + id;
+ },
+
+ overlay: function(dialog) {
+ this.$el = $.ui.dialog.overlay.create(dialog);
+ }
+});
+
+$.extend($.ui.dialog.overlay, {
+ instances: [],
+ // reuse old instances due to IE memory leak with alpha transparency (see #5185)
+ oldInstances: [],
+ maxZ: 0,
+ events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
+ function(event) { return event + '.dialog-overlay'; }).join(' '),
+ create: function(dialog) {
+ if (this.instances.length === 0) {
+ // prevent use of anchors and inputs
+ // we use a setTimeout in case the overlay is created from an
+ // event that we're going to be cancelling (see #2804)
+ setTimeout(function() {
+ // handle $(el).dialog().dialog('close') (see #4065)
+ if ($.ui.dialog.overlay.instances.length) {
+ $(document).bind($.ui.dialog.overlay.events, function(event) {
+ // stop events if the z-index of the target is < the z-index of the overlay
+ // we cannot return true when we don't want to cancel the event (#3523)
+ if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
+ return false;
+ }
+ });
+ }
+ }, 1);
+
+ // allow closing by pressing the escape key
+ $(document).bind('keydown.dialog-overlay', function(event) {
+ if (dialog.options.closeOnEscape && event.keyCode &&
+ event.keyCode === $.ui.keyCode.ESCAPE) {
+
+ dialog.close(event);
+ event.preventDefault();
+ }
+ });
+
+ // handle window resize
+ $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
+ }
+
+ var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
+ .appendTo(document.body)
+ .css({
+ width: this.width(),
+ height: this.height()
+ });
+
+ if ($.fn.bgiframe) {
+ $el.bgiframe();
+ }
+
+ this.instances.push($el);
+ return $el;
+ },
+
+ destroy: function($el) {
+ var indexOf = $.inArray($el, this.instances);
+ if (indexOf != -1){
+ this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
+ }
+
+ if (this.instances.length === 0) {
+ $([document, window]).unbind('.dialog-overlay');
+ }
+
+ $el.remove();
+
+ // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+ var maxZ = 0;
+ $.each(this.instances, function() {
+ maxZ = Math.max(maxZ, this.css('z-index'));
+ });
+ this.maxZ = maxZ;
+ },
+
+ height: function() {
+ var scrollHeight,
+ offsetHeight;
+ // handle IE 6
+ if ($.browser.msie && $.browser.version < 7) {
+ scrollHeight = Math.max(
+ document.documentElement.scrollHeight,
+ document.body.scrollHeight
+ );
+ offsetHeight = Math.max(
+ document.documentElement.offsetHeight,
+ document.body.offsetHeight
+ );
+
+ if (scrollHeight < offsetHeight) {
+ return $(window).height() + 'px';
+ } else {
+ return scrollHeight + 'px';
+ }
+ // handle "good" browsers
+ } else {
+ return $(document).height() + 'px';
+ }
+ },
+
+ width: function() {
+ var scrollWidth,
+ offsetWidth;
+ // handle IE 6
+ if ($.browser.msie && $.browser.version < 7) {
+ scrollWidth = Math.max(
+ document.documentElement.scrollWidth,
+ document.body.scrollWidth
+ );
+ offsetWidth = Math.max(
+ document.documentElement.offsetWidth,
+ document.body.offsetWidth
+ );
+
+ if (scrollWidth < offsetWidth) {
+ return $(window).width() + 'px';
+ } else {
+ return scrollWidth + 'px';
+ }
+ // handle "good" browsers
+ } else {
+ return $(document).width() + 'px';
+ }
+ },
+
+ resize: function() {
+ /* If the dialog is draggable and the user drags it past the
+ * right edge of the window, the document becomes wider so we
+ * need to stretch the overlay. If the user then drags the
+ * dialog back to the left, the document will become narrower,
+ * so we need to shrink the overlay to the appropriate size.
+ * This is handled by shrinking the overlay before setting it
+ * to the full document size.
+ */
+ var $overlays = $([]);
+ $.each($.ui.dialog.overlay.instances, function() {
+ $overlays = $overlays.add(this);
+ });
+
+ $overlays.css({
+ width: 0,
+ height: 0
+ }).css({
+ width: $.ui.dialog.overlay.width(),
+ height: $.ui.dialog.overlay.height()
+ });
+ }
+});
+
+$.extend($.ui.dialog.overlay.prototype, {
+ destroy: function() {
+ $.ui.dialog.overlay.destroy(this.$el);
+ }
+});
+
+}(jQuery));
+/*
+ * jQuery UI Slider 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+// number of pages in a slider
+// (how many times can you page up/down to go through the whole range)
+var numPages = 5;
+
+$.widget( "ui.slider", $.ui.mouse, {
+
+ widgetEventPrefix: "slide",
+
+ options: {
+ animate: false,
+ distance: 0,
+ max: 100,
+ min: 0,
+ orientation: "horizontal",
+ range: false,
+ step: 1,
+ value: 0,
+ values: null
+ },
+
+ _create: function() {
+ var self = this,
+ o = this.options;
+
+ this._keySliding = false;
+ this._mouseSliding = false;
+ this._animateOff = true;
+ this._handleIndex = null;
+ this._detectOrientation();
+ this._mouseInit();
+
+ this.element
+ .addClass( "ui-slider" +
+ " ui-slider-" + this.orientation +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" );
+
+ if ( o.disabled ) {
+ this.element.addClass( "ui-slider-disabled ui-disabled" );
+ }
+
+ this.range = $([]);
+
+ if ( o.range ) {
+ if ( o.range === true ) {
+ this.range = $( "<div></div>" );
+ if ( !o.values ) {
+ o.values = [ this._valueMin(), this._valueMin() ];
+ }
+ if ( o.values.length && o.values.length !== 2 ) {
+ o.values = [ o.values[0], o.values[0] ];
+ }
+ } else {
+ this.range = $( "<div></div>" );
+ }
+
+ this.range
+ .appendTo( this.element )
+ .addClass( "ui-slider-range" );
+
+ if ( o.range === "min" || o.range === "max" ) {
+ this.range.addClass( "ui-slider-range-" + o.range );
+ }
+
+ // note: this isn't the most fittingly semantic framework class for this element,
+ // but worked best visually with a variety of themes
+ this.range.addClass( "ui-widget-header" );
+ }
+
+ if ( $( ".ui-slider-handle", this.element ).length === 0 ) {
+ $( "<a href='#'></a>" )
+ .appendTo( this.element )
+ .addClass( "ui-slider-handle" );
+ }
+
+ if ( o.values && o.values.length ) {
+ while ( $(".ui-slider-handle", this.element).length < o.values.length ) {
+ $( "<a href='#'></a>" )
+ .appendTo( this.element )
+ .addClass( "ui-slider-handle" );
+ }
+ }
+
+ this.handles = $( ".ui-slider-handle", this.element )
+ .addClass( "ui-state-default" +
+ " ui-corner-all" );
+
+ this.handle = this.handles.eq( 0 );
+
+ this.handles.add( this.range ).filter( "a" )
+ .click(function( event ) {
+ event.preventDefault();
+ })
+ .hover(function() {
+ if ( !o.disabled ) {
+ $( this ).addClass( "ui-state-hover" );
+ }
+ }, function() {
+ $( this ).removeClass( "ui-state-hover" );
+ })
+ .focus(function() {
+ if ( !o.disabled ) {
+ $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
+ $( this ).addClass( "ui-state-focus" );
+ } else {
+ $( this ).blur();
+ }
+ })
+ .blur(function() {
+ $( this ).removeClass( "ui-state-focus" );
+ });
+
+ this.handles.each(function( i ) {
+ $( this ).data( "index.ui-slider-handle", i );
+ });
+
+ this.handles
+ .keydown(function( event ) {
+ var ret = true,
+ index = $( this ).data( "index.ui-slider-handle" ),
+ allowed,
+ curVal,
+ newVal,
+ step;
+
+ if ( self.options.disabled ) {
+ return;
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ case $.ui.keyCode.END:
+ case $.ui.keyCode.PAGE_UP:
+ case $.ui.keyCode.PAGE_DOWN:
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ ret = false;
+ if ( !self._keySliding ) {
+ self._keySliding = true;
+ $( this ).addClass( "ui-state-active" );
+ allowed = self._start( event, index );
+ if ( allowed === false ) {
+ return;
+ }
+ }
+ break;
+ }
+
+ step = self.options.step;
+ if ( self.options.values && self.options.values.length ) {
+ curVal = newVal = self.values( index );
+ } else {
+ curVal = newVal = self.value();
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ newVal = self._valueMin();
+ break;
+ case $.ui.keyCode.END:
+ newVal = self._valueMax();
+ break;
+ case $.ui.keyCode.PAGE_UP:
+ newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
+ break;
+ case $.ui.keyCode.PAGE_DOWN:
+ newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
+ break;
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ if ( curVal === self._valueMax() ) {
+ return;
+ }
+ newVal = self._trimAlignValue( curVal + step );
+ break;
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ if ( curVal === self._valueMin() ) {
+ return;
+ }
+ newVal = self._trimAlignValue( curVal - step );
+ break;
+ }
+
+ self._slide( event, index, newVal );
+
+ return ret;
+
+ })
+ .keyup(function( event ) {
+ var index = $( this ).data( "index.ui-slider-handle" );
+
+ if ( self._keySliding ) {
+ self._keySliding = false;
+ self._stop( event, index );
+ self._change( event, index );
+ $( this ).removeClass( "ui-state-active" );
+ }
+
+ });
+
+ this._refreshValue();
+
+ this._animateOff = false;
+ },
+
+ destroy: function() {
+ this.handles.remove();
+ this.range.remove();
+
+ this.element
+ .removeClass( "ui-slider" +
+ " ui-slider-horizontal" +
+ " ui-slider-vertical" +
+ " ui-slider-disabled" +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" )
+ .removeData( "slider" )
+ .unbind( ".slider" );
+
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseCapture: function( event ) {
+ var o = this.options,
+ position,
+ normValue,
+ distance,
+ closestHandle,
+ self,
+ index,
+ allowed,
+ offset,
+ mouseOverHandle;
+
+ if ( o.disabled ) {
+ return false;
+ }
+
+ this.elementSize = {
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight()
+ };
+ this.elementOffset = this.element.offset();
+
+ position = { x: event.pageX, y: event.pageY };
+ normValue = this._normValueFromMouse( position );
+ distance = this._valueMax() - this._valueMin() + 1;
+ self = this;
+ this.handles.each(function( i ) {
+ var thisDistance = Math.abs( normValue - self.values(i) );
+ if ( distance > thisDistance ) {
+ distance = thisDistance;
+ closestHandle = $( this );
+ index = i;
+ }
+ });
+
+ // workaround for bug #3736 (if both handles of a range are at 0,
+ // the first is always used as the one with least distance,
+ // and moving it is obviously prevented by preventing negative ranges)
+ if( o.range === true && this.values(1) === o.min ) {
+ index += 1;
+ closestHandle = $( this.handles[index] );
+ }
+
+ allowed = this._start( event, index );
+ if ( allowed === false ) {
+ return false;
+ }
+ this._mouseSliding = true;
+
+ self._handleIndex = index;
+
+ closestHandle
+ .addClass( "ui-state-active" )
+ .focus();
+
+ offset = closestHandle.offset();
+ mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
+ this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
+ left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+ top: event.pageY - offset.top -
+ ( closestHandle.height() / 2 ) -
+ ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+ ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+ ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
+ };
+
+ if ( !this.handles.hasClass( "ui-state-hover" ) ) {
+ this._slide( event, index, normValue );
+ }
+ this._animateOff = true;
+ return true;
+ },
+
+ _mouseStart: function( event ) {
+ return true;
+ },
+
+ _mouseDrag: function( event ) {
+ var position = { x: event.pageX, y: event.pageY },
+ normValue = this._normValueFromMouse( position );
+
+ this._slide( event, this._handleIndex, normValue );
+
+ return false;
+ },
+
+ _mouseStop: function( event ) {
+ this.handles.removeClass( "ui-state-active" );
+ this._mouseSliding = false;
+
+ this._stop( event, this._handleIndex );
+ this._change( event, this._handleIndex );
+
+ this._handleIndex = null;
+ this._clickOffset = null;
+ this._animateOff = false;
+
+ return false;
+ },
+
+ _detectOrientation: function() {
+ this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
+ },
+
+ _normValueFromMouse: function( position ) {
+ var pixelTotal,
+ pixelMouse,
+ percentMouse,
+ valueTotal,
+ valueMouse;
+
+ if ( this.orientation === "horizontal" ) {
+ pixelTotal = this.elementSize.width;
+ pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
+ } else {
+ pixelTotal = this.elementSize.height;
+ pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
+ }
+
+ percentMouse = ( pixelMouse / pixelTotal );
+ if ( percentMouse > 1 ) {
+ percentMouse = 1;
+ }
+ if ( percentMouse < 0 ) {
+ percentMouse = 0;
+ }
+ if ( this.orientation === "vertical" ) {
+ percentMouse = 1 - percentMouse;
+ }
+
+ valueTotal = this._valueMax() - this._valueMin();
+ valueMouse = this._valueMin() + percentMouse * valueTotal;
+
+ return this._trimAlignValue( valueMouse );
+ },
+
+ _start: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+ return this._trigger( "start", event, uiHash );
+ },
+
+ _slide: function( event, index, newVal ) {
+ var otherVal,
+ newValues,
+ allowed;
+
+ if ( this.options.values && this.options.values.length ) {
+ otherVal = this.values( index ? 0 : 1 );
+
+ if ( ( this.options.values.length === 2 && this.options.range === true ) &&
+ ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
+ ) {
+ newVal = otherVal;
+ }
+
+ if ( newVal !== this.values( index ) ) {
+ newValues = this.values();
+ newValues[ index ] = newVal;
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal,
+ values: newValues
+ } );
+ otherVal = this.values( index ? 0 : 1 );
+ if ( allowed !== false ) {
+ this.values( index, newVal, true );
+ }
+ }
+ } else {
+ if ( newVal !== this.value() ) {
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal
+ } );
+ if ( allowed !== false ) {
+ this.value( newVal );
+ }
+ }
+ }
+ },
+
+ _stop: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ this._trigger( "stop", event, uiHash );
+ },
+
+ _change: function( event, index ) {
+ if ( !this._keySliding && !this._mouseSliding ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ this._trigger( "change", event, uiHash );
+ }
+ },
+
+ value: function( newValue ) {
+ if ( arguments.length ) {
+ this.options.value = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, 0 );
+ }
+
+ return this._value();
+ },
+
+ values: function( index, newValue ) {
+ var vals,
+ newValues,
+ i;
+
+ if ( arguments.length > 1 ) {
+ this.options.values[ index ] = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, index );
+ }
+
+ if ( arguments.length ) {
+ if ( $.isArray( arguments[ 0 ] ) ) {
+ vals = this.options.values;
+ newValues = arguments[ 0 ];
+ for ( i = 0; i < vals.length; i += 1 ) {
+ vals[ i ] = this._trimAlignValue( newValues[ i ] );
+ this._change( null, i );
+ }
+ this._refreshValue();
+ } else {
+ if ( this.options.values && this.options.values.length ) {
+ return this._values( index );
+ } else {
+ return this.value();
+ }
+ }
+ } else {
+ return this._values();
+ }
+ },
+
+ _setOption: function( key, value ) {
+ var i,
+ valsLength = 0;
+
+ if ( $.isArray( this.options.values ) ) {
+ valsLength = this.options.values.length;
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+
+ switch ( key ) {
+ case "disabled":
+ if ( value ) {
+ this.handles.filter( ".ui-state-focus" ).blur();
+ this.handles.removeClass( "ui-state-hover" );
+ this.handles.attr( "disabled", "disabled" );
+ this.element.addClass( "ui-disabled" );
+ } else {
+ this.handles.removeAttr( "disabled" );
+ this.element.removeClass( "ui-disabled" );
+ }
+ break;
+ case "orientation":
+ this._detectOrientation();
+ this.element
+ .removeClass( "ui-slider-horizontal ui-slider-vertical" )
+ .addClass( "ui-slider-" + this.orientation );
+ this._refreshValue();
+ break;
+ case "value":
+ this._animateOff = true;
+ this._refreshValue();
+ this._change( null, 0 );
+ this._animateOff = false;
+ break;
+ case "values":
+ this._animateOff = true;
+ this._refreshValue();
+ for ( i = 0; i < valsLength; i += 1 ) {
+ this._change( null, i );
+ }
+ this._animateOff = false;
+ break;
+ }
+ },
+
+ //internal value getter
+ // _value() returns value trimmed by min and max, aligned by step
+ _value: function() {
+ var val = this.options.value;
+ val = this._trimAlignValue( val );
+
+ return val;
+ },
+
+ //internal values getter
+ // _values() returns array of values trimmed by min and max, aligned by step
+ // _values( index ) returns single value trimmed by min and max, aligned by step
+ _values: function( index ) {
+ var val,
+ vals,
+ i;
+
+ if ( arguments.length ) {
+ val = this.options.values[ index ];
+ val = this._trimAlignValue( val );
+
+ return val;
+ } else {
+ // .slice() creates a copy of the array
+ // this copy gets trimmed by min and max and then returned
+ vals = this.options.values.slice();
+ for ( i = 0; i < vals.length; i+= 1) {
+ vals[ i ] = this._trimAlignValue( vals[ i ] );
+ }
+
+ return vals;
+ }
+ },
+
+ // returns the step-aligned value that val is closest to, between (inclusive) min and max
+ _trimAlignValue: function( val ) {
+ if ( val <= this._valueMin() ) {
+ return this._valueMin();
+ }
+ if ( val >= this._valueMax() ) {
+ return this._valueMax();
+ }
+ var step = ( this.options.step > 0 ) ? this.options.step : 1,
+ valModStep = (val - this._valueMin()) % step;
+ alignValue = val - valModStep;
+
+ if ( Math.abs(valModStep) * 2 >= step ) {
+ alignValue += ( valModStep > 0 ) ? step : ( -step );
+ }
+
+ // Since JavaScript has problems with large floats, round
+ // the final value to 5 digits after the decimal point (see #4124)
+ return parseFloat( alignValue.toFixed(5) );
+ },
+
+ _valueMin: function() {
+ return this.options.min;
+ },
+
+ _valueMax: function() {
+ return this.options.max;
+ },
+
+ _refreshValue: function() {
+ var oRange = this.options.range,
+ o = this.options,
+ self = this,
+ animate = ( !this._animateOff ) ? o.animate : false,
+ valPercent,
+ _set = {},
+ lastValPercent,
+ value,
+ valueMin,
+ valueMax;
+
+ if ( this.options.values && this.options.values.length ) {
+ this.handles.each(function( i, j ) {
+ valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+ $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+ if ( self.options.range === true ) {
+ if ( self.orientation === "horizontal" ) {
+ if ( i === 0 ) {
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ } else {
+ if ( i === 0 ) {
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ }
+ lastValPercent = valPercent;
+ });
+ } else {
+ value = this.value();
+ valueMin = this._valueMin();
+ valueMax = this._valueMax();
+ valPercent = ( valueMax !== valueMin ) ?
+ ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+ 0;
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+ this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+
+ if ( oRange === "min" && this.orientation === "horizontal" ) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "horizontal" ) {
+ this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ if ( oRange === "min" && this.orientation === "vertical" ) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "vertical" ) {
+ this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ }
+
+});
+
+$.extend( $.ui.slider, {
+ version: "1.8.10"
+});
+
+}(jQuery));
+/*
+ * jQuery UI Tabs 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var tabId = 0,
+ listId = 0;
+
+function getNextTabId() {
+ return ++tabId;
+}
+
+function getNextListId() {
+ return ++listId;
+}
+
+$.widget( "ui.tabs", {
+ options: {
+ add: null,
+ ajaxOptions: null,
+ cache: false,
+ cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+ collapsible: false,
+ disable: null,
+ disabled: [],
+ enable: null,
+ event: "click",
+ fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
+ idPrefix: "ui-tabs-",
+ load: null,
+ panelTemplate: "<div></div>",
+ remove: null,
+ select: null,
+ show: null,
+ spinner: "<em>Loading…</em>",
+ tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
+ },
+
+ _create: function() {
+ this._tabify( true );
+ },
+
+ _setOption: function( key, value ) {
+ if ( key == "selected" ) {
+ if (this.options.collapsible && value == this.options.selected ) {
+ return;
+ }
+ this.select( value );
+ } else {
+ this.options[ key ] = value;
+ this._tabify();
+ }
+ },
+
+ _tabId: function( a ) {
+ return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) ||
+ this.options.idPrefix + getNextTabId();
+ },
+
+ _sanitizeSelector: function( hash ) {
+ // we need this because an id may contain a ":"
+ return hash.replace( /:/g, "\\:" );
+ },
+
+ _cookie: function() {
+ var cookie = this.cookie ||
+ ( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() );
+ return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) );
+ },
+
+ _ui: function( tab, panel ) {
+ return {
+ tab: tab,
+ panel: panel,
+ index: this.anchors.index( tab )
+ };
+ },
+
+ _cleanup: function() {
+ // restore all former loading tabs labels
+ this.lis.filter( ".ui-state-processing" )
+ .removeClass( "ui-state-processing" )
+ .find( "span:data(label.tabs)" )
+ .each(function() {
+ var el = $( this );
+ el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" );
+ });
+ },
+
+ _tabify: function( init ) {
+ var self = this,
+ o = this.options,
+ fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
+
+ this.list = this.element.find( "ol,ul" ).eq( 0 );
+ this.lis = $( " > li:has(a[href])", this.list );
+ this.anchors = this.lis.map(function() {
+ return $( "a", this )[ 0 ];
+ });
+ this.panels = $( [] );
+
+ this.anchors.each(function( i, a ) {
+ var href = $( a ).attr( "href" );
+ // For dynamically created HTML that contains a hash as href IE < 8 expands
+ // such href to the full page url with hash and then misinterprets tab as ajax.
+ // Same consideration applies for an added tab with a fragment identifier
+ // since a[href=#fragment-identifier] does unexpectedly not match.
+ // Thus normalize href attribute...
+ var hrefBase = href.split( "#" )[ 0 ],
+ baseEl;
+ if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
+ ( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
+ href = a.hash;
+ a.href = href;
+ }
+
+ // inline tab
+ if ( fragmentId.test( href ) ) {
+ self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) );
+ // remote tab
+ // prevent loading the page itself if href is just "#"
+ } else if ( href && href !== "#" ) {
+ // required for restore on destroy
+ $.data( a, "href.tabs", href );
+
+ // TODO until #3808 is fixed strip fragment identifier from url
+ // (IE fails to load from such url)
+ $.data( a, "load.tabs", href.replace( /#.*$/, "" ) );
+
+ var id = self._tabId( a );
+ a.href = "#" + id;
+ var $panel = self.element.find( "#" + id );
+ if ( !$panel.length ) {
+ $panel = $( o.panelTemplate )
+ .attr( "id", id )
+ .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+ .insertAfter( self.panels[ i - 1 ] || self.list );
+ $panel.data( "destroy.tabs", true );
+ }
+ self.panels = self.panels.add( $panel );
+ // invalid tab href
+ } else {
+ o.disabled.push( i );
+ }
+ });
+
+ // initialization from scratch
+ if ( init ) {
+ // attach necessary classes for styling
+ this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
+ this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+ this.lis.addClass( "ui-state-default ui-corner-top" );
+ this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
+
+ // Selected tab
+ // use "selected" option or try to retrieve:
+ // 1. from fragment identifier in url
+ // 2. from cookie
+ // 3. from selected class attribute on <li>
+ if ( o.selected === undefined ) {
+ if ( location.hash ) {
+ this.anchors.each(function( i, a ) {
+ if ( a.hash == location.hash ) {
+ o.selected = i;
+ return false;
+ }
+ });
+ }
+ if ( typeof o.selected !== "number" && o.cookie ) {
+ o.selected = parseInt( self._cookie(), 10 );
+ }
+ if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) {
+ o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+ }
+ o.selected = o.selected || ( this.lis.length ? 0 : -1 );
+ } else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release
+ o.selected = -1;
+ }
+
+ // sanity check - default to first tab...
+ o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 )
+ ? o.selected
+ : 0;
+
+ // Take disabling tabs via class attribute from HTML
+ // into account and update option properly.
+ // A selected tab cannot become disabled.
+ o.disabled = $.unique( o.disabled.concat(
+ $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
+ return self.lis.index( n );
+ })
+ ) ).sort();
+
+ if ( $.inArray( o.selected, o.disabled ) != -1 ) {
+ o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
+ }
+
+ // highlight selected tab
+ this.panels.addClass( "ui-tabs-hide" );
+ this.lis.removeClass( "ui-tabs-selected ui-state-active" );
+ // check for length avoids error when initializing empty list
+ if ( o.selected >= 0 && this.anchors.length ) {
+ self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" );
+ this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" );
+
+ // seems to be expected behavior that the show callback is fired
+ self.element.queue( "tabs", function() {
+ self._trigger( "show", null,
+ self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) );
+ });
+
+ this.load( o.selected );
+ }
+
+ // clean up to avoid memory leaks in certain versions of IE 6
+ // TODO: namespace this event
+ $( window ).bind( "unload", function() {
+ self.lis.add( self.anchors ).unbind( ".tabs" );
+ self.lis = self.anchors = self.panels = null;
+ });
+ // update selected after add/remove
+ } else {
+ o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+ }
+
+ // update collapsible
+ // TODO: use .toggleClass()
+ this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" );
+
+ // set or update cookie after init and add/remove respectively
+ if ( o.cookie ) {
+ this._cookie( o.selected, o.cookie );
+ }
+
+ // disable tabs
+ for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
+ $( li )[ $.inArray( i, o.disabled ) != -1 &&
+ // TODO: use .toggleClass()
+ !$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" );
+ }
+
+ // reset cache if switching from cached to not cached
+ if ( o.cache === false ) {
+ this.anchors.removeData( "cache.tabs" );
+ }
+
+ // remove all handlers before, tabify may run on existing tabs after add or option change
+ this.lis.add( this.anchors ).unbind( ".tabs" );
+
+ if ( o.event !== "mouseover" ) {
+ var addState = function( state, el ) {
+ if ( el.is( ":not(.ui-state-disabled)" ) ) {
+ el.addClass( "ui-state-" + state );
+ }
+ };
+ var removeState = function( state, el ) {
+ el.removeClass( "ui-state-" + state );
+ };
+ this.lis.bind( "mouseover.tabs" , function() {
+ addState( "hover", $( this ) );
+ });
+ this.lis.bind( "mouseout.tabs", function() {
+ removeState( "hover", $( this ) );
+ });
+ this.anchors.bind( "focus.tabs", function() {
+ addState( "focus", $( this ).closest( "li" ) );
+ });
+ this.anchors.bind( "blur.tabs", function() {
+ removeState( "focus", $( this ).closest( "li" ) );
+ });
+ }
+
+ // set up animations
+ var hideFx, showFx;
+ if ( o.fx ) {
+ if ( $.isArray( o.fx ) ) {
+ hideFx = o.fx[ 0 ];
+ showFx = o.fx[ 1 ];
+ } else {
+ hideFx = showFx = o.fx;
+ }
+ }
+
+ // Reset certain styles left over from animation
+ // and prevent IE's ClearType bug...
+ function resetStyle( $el, fx ) {
+ $el.css( "display", "" );
+ if ( !$.support.opacity && fx.opacity ) {
+ $el[ 0 ].style.removeAttribute( "filter" );
+ }
+ }
+
+ // Show a tab...
+ var showTab = showFx
+ ? function( clicked, $show ) {
+ $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+ $show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way
+ .animate( showFx, showFx.duration || "normal", function() {
+ resetStyle( $show, showFx );
+ self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+ });
+ }
+ : function( clicked, $show ) {
+ $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+ $show.removeClass( "ui-tabs-hide" );
+ self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+ };
+
+ // Hide a tab, $show is optional...
+ var hideTab = hideFx
+ ? function( clicked, $hide ) {
+ $hide.animate( hideFx, hideFx.duration || "normal", function() {
+ self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+ $hide.addClass( "ui-tabs-hide" );
+ resetStyle( $hide, hideFx );
+ self.element.dequeue( "tabs" );
+ });
+ }
+ : function( clicked, $hide, $show ) {
+ self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+ $hide.addClass( "ui-tabs-hide" );
+ self.element.dequeue( "tabs" );
+ };
+
+ // attach tab event handler, unbind to avoid duplicates from former tabifying...
+ this.anchors.bind( o.event + ".tabs", function() {
+ var el = this,
+ $li = $(el).closest( "li" ),
+ $hide = self.panels.filter( ":not(.ui-tabs-hide)" ),
+ $show = self.element.find( self._sanitizeSelector( el.hash ) );
+
+ // If tab is already selected and not collapsible or tab disabled or
+ // or is already loading or click callback returns false stop here.
+ // Check if click handler returns false last so that it is not executed
+ // for a disabled or loading tab!
+ if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) ||
+ $li.hasClass( "ui-state-disabled" ) ||
+ $li.hasClass( "ui-state-processing" ) ||
+ self.panels.filter( ":animated" ).length ||
+ self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) {
+ this.blur();
+ return false;
+ }
+
+ o.selected = self.anchors.index( this );
+
+ self.abort();
+
+ // if tab may be closed
+ if ( o.collapsible ) {
+ if ( $li.hasClass( "ui-tabs-selected" ) ) {
+ o.selected = -1;
+
+ if ( o.cookie ) {
+ self._cookie( o.selected, o.cookie );
+ }
+
+ self.element.queue( "tabs", function() {
+ hideTab( el, $hide );
+ }).dequeue( "tabs" );
+
+ this.blur();
+ return false;
+ } else if ( !$hide.length ) {
+ if ( o.cookie ) {
+ self._cookie( o.selected, o.cookie );
+ }
+
+ self.element.queue( "tabs", function() {
+ showTab( el, $show );
+ });
+
+ // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
+ self.load( self.anchors.index( this ) );
+
+ this.blur();
+ return false;
+ }
+ }
+
+ if ( o.cookie ) {
+ self._cookie( o.selected, o.cookie );
+ }
+
+ // show new tab
+ if ( $show.length ) {
+ if ( $hide.length ) {
+ self.element.queue( "tabs", function() {
+ hideTab( el, $hide );
+ });
+ }
+ self.element.queue( "tabs", function() {
+ showTab( el, $show );
+ });
+
+ self.load( self.anchors.index( this ) );
+ } else {
+ throw "jQuery UI Tabs: Mismatching fragment identifier.";
+ }
+
+ // Prevent IE from keeping other link focussed when using the back button
+ // and remove dotted border from clicked link. This is controlled via CSS
+ // in modern browsers; blur() removes focus from address bar in Firefox
+ // which can become a usability and annoying problem with tabs('rotate').
+ if ( $.browser.msie ) {
+ this.blur();
+ }
+ });
+
+ // disable click in any case
+ this.anchors.bind( "click.tabs", function(){
+ return false;
+ });
+ },
+
+ _getIndex: function( index ) {
+ // meta-function to give users option to provide a href string instead of a numerical index.
+ // also sanitizes numerical indexes to valid values.
+ if ( typeof index == "string" ) {
+ index = this.anchors.index( this.anchors.filter( "[href$=" + index + "]" ) );
+ }
+
+ return index;
+ },
+
+ destroy: function() {
+ var o = this.options;
+
+ this.abort();
+
+ this.element
+ .unbind( ".tabs" )
+ .removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" )
+ .removeData( "tabs" );
+
+ this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+
+ this.anchors.each(function() {
+ var href = $.data( this, "href.tabs" );
+ if ( href ) {
+ this.href = href;
+ }
+ var $this = $( this ).unbind( ".tabs" );
+ $.each( [ "href", "load", "cache" ], function( i, prefix ) {
+ $this.removeData( prefix + ".tabs" );
+ });
+ });
+
+ this.lis.unbind( ".tabs" ).add( this.panels ).each(function() {
+ if ( $.data( this, "destroy.tabs" ) ) {
+ $( this ).remove();
+ } else {
+ $( this ).removeClass([
+ "ui-state-default",
+ "ui-corner-top",
+ "ui-tabs-selected",
+ "ui-state-active",
+ "ui-state-hover",
+ "ui-state-focus",
+ "ui-state-disabled",
+ "ui-tabs-panel",
+ "ui-widget-content",
+ "ui-corner-bottom",
+ "ui-tabs-hide"
+ ].join( " " ) );
+ }
+ });
+
+ if ( o.cookie ) {
+ this._cookie( null, o.cookie );
+ }
+
+ return this;
+ },
+
+ add: function( url, label, index ) {
+ if ( index === undefined ) {
+ index = this.anchors.length;
+ }
+
+ var self = this,
+ o = this.options,
+ $li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ),
+ id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] );
+
+ $li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
+
+ // try to find an existing element before creating a new one
+ var $panel = self.element.find( "#" + id );
+ if ( !$panel.length ) {
+ $panel = $( o.panelTemplate )
+ .attr( "id", id )
+ .data( "destroy.tabs", true );
+ }
+ $panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
+
+ if ( index >= this.lis.length ) {
+ $li.appendTo( this.list );
+ $panel.appendTo( this.list[ 0 ].parentNode );
+ } else {
+ $li.insertBefore( this.lis[ index ] );
+ $panel.insertBefore( this.panels[ index ] );
+ }
+
+ o.disabled = $.map( o.disabled, function( n, i ) {
+ return n >= index ? ++n : n;
+ });
+
+ this._tabify();
+
+ if ( this.anchors.length == 1 ) {
+ o.selected = 0;
+ $li.addClass( "ui-tabs-selected ui-state-active" );
+ $panel.removeClass( "ui-tabs-hide" );
+ this.element.queue( "tabs", function() {
+ self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) );
+ });
+
+ this.load( 0 );
+ }
+
+ this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+ return this;
+ },
+
+ remove: function( index ) {
+ index = this._getIndex( index );
+ var o = this.options,
+ $li = this.lis.eq( index ).remove(),
+ $panel = this.panels.eq( index ).remove();
+
+ // If selected tab was removed focus tab to the right or
+ // in case the last tab was removed the tab to the left.
+ if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) {
+ this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
+ }
+
+ o.disabled = $.map(
+ $.grep( o.disabled, function(n, i) {
+ return n != index;
+ }),
+ function( n, i ) {
+ return n >= index ? --n : n;
+ });
+
+ this._tabify();
+
+ this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) );
+ return this;
+ },
+
+ enable: function( index ) {
+ index = this._getIndex( index );
+ var o = this.options;
+ if ( $.inArray( index, o.disabled ) == -1 ) {
+ return;
+ }
+
+ this.lis.eq( index ).removeClass( "ui-state-disabled" );
+ o.disabled = $.grep( o.disabled, function( n, i ) {
+ return n != index;
+ });
+
+ this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+ return this;
+ },
+
+ disable: function( index ) {
+ index = this._getIndex( index );
+ var self = this, o = this.options;
+ // cannot disable already selected tab
+ if ( index != o.selected ) {
+ this.lis.eq( index ).addClass( "ui-state-disabled" );
+
+ o.disabled.push( index );
+ o.disabled.sort();
+
+ this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+ }
+
+ return this;
+ },
+
+ select: function( index ) {
+ index = this._getIndex( index );
+ if ( index == -1 ) {
+ if ( this.options.collapsible && this.options.selected != -1 ) {
+ index = this.options.selected;
+ } else {
+ return this;
+ }
+ }
+ this.anchors.eq( index ).trigger( this.options.event + ".tabs" );
+ return this;
+ },
+
+ load: function( index ) {
+ index = this._getIndex( index );
+ var self = this,
+ o = this.options,
+ a = this.anchors.eq( index )[ 0 ],
+ url = $.data( a, "load.tabs" );
+
+ this.abort();
+
+ // not remote or from cache
+ if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) {
+ this.element.dequeue( "tabs" );
+ return;
+ }
+
+ // load remote from here on
+ this.lis.eq( index ).addClass( "ui-state-processing" );
+
+ if ( o.spinner ) {
+ var span = $( "span", a );
+ span.data( "label.tabs", span.html() ).html( o.spinner );
+ }
+
+ this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, {
+ url: url,
+ success: function( r, s ) {
+ self.element.find( self._sanitizeSelector( a.hash ) ).html( r );
+
+ // take care of tab labels
+ self._cleanup();
+
+ if ( o.cache ) {
+ $.data( a, "cache.tabs", true );
+ }
+
+ self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+ try {
+ o.ajaxOptions.success( r, s );
+ }
+ catch ( e ) {}
+ },
+ error: function( xhr, s, e ) {
+ // take care of tab labels
+ self._cleanup();
+
+ self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+ try {
+ // Passing index avoid a race condition when this method is
+ // called after the user has selected another tab.
+ // Pass the anchor that initiated this request allows
+ // loadError to manipulate the tab content panel via $(a.hash)
+ o.ajaxOptions.error( xhr, s, index, a );
+ }
+ catch ( e ) {}
+ }
+ } ) );
+
+ // last, so that load event is fired before show...
+ self.element.dequeue( "tabs" );
+
+ return this;
+ },
+
+ abort: function() {
+ // stop possibly running animations
+ this.element.queue( [] );
+ this.panels.stop( false, true );
+
+ // "tabs" queue must not contain more than two elements,
+ // which are the callbacks for the latest clicked tab...
+ this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
+
+ // terminate pending requests from other tabs
+ if ( this.xhr ) {
+ this.xhr.abort();
+ delete this.xhr;
+ }
+
+ // take care of tab labels
+ this._cleanup();
+ return this;
+ },
+
+ url: function( index, url ) {
+ this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url );
+ return this;
+ },
+
+ length: function() {
+ return this.anchors.length;
+ }
+});
+
+$.extend( $.ui.tabs, {
+ version: "1.8.10"
+});
+
+/*
+ * Tabs Extensions
+ */
+
+/*
+ * Rotate
+ */
+$.extend( $.ui.tabs.prototype, {
+ rotation: null,
+ rotate: function( ms, continuing ) {
+ var self = this,
+ o = this.options;
+
+ var rotate = self._rotate || ( self._rotate = function( e ) {
+ clearTimeout( self.rotation );
+ self.rotation = setTimeout(function() {
+ var t = o.selected;
+ self.select( ++t < self.anchors.length ? t : 0 );
+ }, ms );
+
+ if ( e ) {
+ e.stopPropagation();
+ }
+ });
+
+ var stop = self._unrotate || ( self._unrotate = !continuing
+ ? function(e) {
+ if (e.clientX) { // in case of a true click
+ self.rotate(null);
+ }
+ }
+ : function( e ) {
+ t = o.selected;
+ rotate();
+ });
+
+ // start rotation
+ if ( ms ) {
+ this.element.bind( "tabsshow", rotate );
+ this.anchors.bind( o.event + ".tabs", stop );
+ rotate();
+ // stop rotation
+ } else {
+ clearTimeout( self.rotation );
+ this.element.unbind( "tabsshow", rotate );
+ this.anchors.unbind( o.event + ".tabs", stop );
+ delete this._rotate;
+ delete this._unrotate;
+ }
+
+ return this;
+ }
+});
+
+})( jQuery );
+/*
+ * jQuery UI Datepicker 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ * jquery.ui.core.js
+ */
+(function( $, undefined ) {
+
+$.extend($.ui, { datepicker: { version: "1.8.10" } });
+
+var PROP_NAME = 'datepicker';
+var dpuuid = new Date().getTime();
+
+/* Date picker manager.
+ Use the singleton instance of this class, $.datepicker, to interact with the date picker.
+ Settings for (groups of) date pickers are maintained in an instance object,
+ allowing multiple different settings on the same page. */
+
+function Datepicker() {
+ this.debug = false; // Change this to true to start debugging
+ this._curInst = null; // The current instance in use
+ this._keyEvent = false; // If the last event was a key event
+ this._disabledInputs = []; // List of date picker inputs that have been disabled
+ this._datepickerShowing = false; // True if the popup picker is showing , false if not
+ this._inDialog = false; // True if showing within a "dialog", false if not
+ this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
+ this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
+ this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
+ this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
+ this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
+ this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
+ this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
+ this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
+ this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
+ this.regional = []; // Available regional settings, indexed by language code
+ this.regional[''] = { // Default regional settings
+ closeText: 'Done', // Display text for close link
+ prevText: 'Prev', // Display text for previous month link
+ nextText: 'Next', // Display text for next month link
+ currentText: 'Today', // Display text for current month link
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'], // Names of months for drop-down and formatting
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
+ weekHeader: 'Wk', // Column header for week of the year
+ dateFormat: 'mm/dd/yy', // See format options on parseDate
+ firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+ isRTL: false, // True if right-to-left language, false if left-to-right
+ showMonthAfterYear: false, // True if the year select precedes month, false for month then year
+ yearSuffix: '' // Additional text to append to the year in the month headers
+ };
+ this._defaults = { // Global defaults for all the date picker instances
+ showOn: 'focus', // 'focus' for popup on focus,
+ // 'button' for trigger button, or 'both' for either
+ showAnim: 'fadeIn', // Name of jQuery animation for popup
+ showOptions: {}, // Options for enhanced animations
+ defaultDate: null, // Used when field is blank: actual date,
+ // +/-number for offset from today, null for today
+ appendText: '', // Display text following the input box, e.g. showing the format
+ buttonText: '...', // Text for trigger button
+ buttonImage: '', // URL for trigger button image
+ buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
+ hideIfNoPrevNext: false, // True to hide next/previous month links
+ // if not applicable, false to just disable them
+ navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
+ gotoCurrent: false, // True if today link goes back to current selection instead
+ changeMonth: false, // True if month can be selected directly, false if only prev/next
+ changeYear: false, // True if year can be selected directly, false if only prev/next
+ yearRange: 'c-10:c+10', // Range of years to display in drop-down,
+ // either relative to today's year (-nn:+nn), relative to currently displayed year
+ // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+ showOtherMonths: false, // True to show dates in other months, false to leave blank
+ selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
+ showWeek: false, // True to show week of the year, false to not show it
+ calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+ // takes a Date and returns the number of the week for it
+ shortYearCutoff: '+10', // Short year values < this are in the current century,
+ // > this are in the previous century,
+ // string value starting with '+' for current year + value
+ minDate: null, // The earliest selectable date, or null for no limit
+ maxDate: null, // The latest selectable date, or null for no limit
+ duration: 'fast', // Duration of display/closure
+ beforeShowDay: null, // Function that takes a date and returns an array with
+ // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
+ // [2] = cell title (optional), e.g. $.datepicker.noWeekends
+ beforeShow: null, // Function that takes an input field and
+ // returns a set of custom settings for the date picker
+ onSelect: null, // Define a callback function when a date is selected
+ onChangeMonthYear: null, // Define a callback function when the month or year is changed
+ onClose: null, // Define a callback function when the datepicker is closed
+ numberOfMonths: 1, // Number of months to show at a time
+ showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
+ stepMonths: 1, // Number of months to step back/forward
+ stepBigMonths: 12, // Number of months to step back/forward for the big links
+ altField: '', // Selector for an alternate field to store selected dates into
+ altFormat: '', // The date format to use for the alternate field
+ constrainInput: true, // The input is constrained by the current date format
+ showButtonPanel: false, // True to show button panel, false to not show it
+ autoSize: false // True to size the input for the date format, false to leave as is
+ };
+ $.extend(this._defaults, this.regional['']);
+ this.dpDiv = $('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>');
+}
+
+$.extend(Datepicker.prototype, {
+ /* Class name added to elements to indicate already configured with a date picker. */
+ markerClassName: 'hasDatepicker',
+
+ /* Debug logging (if enabled). */
+ log: function () {
+ if (this.debug)
+ console.log.apply('', arguments);
+ },
+
+ // TODO rename to "widget" when switching to widget factory
+ _widgetDatepicker: function() {
+ return this.dpDiv;
+ },
+
+ /* Override the default settings for all instances of the date picker.
+ @param settings object - the new settings to use as defaults (anonymous object)
+ @return the manager object */
+ setDefaults: function(settings) {
+ extendRemove(this._defaults, settings || {});
+ return this;
+ },
+
+ /* Attach the date picker to a jQuery selection.
+ @param target element - the target input field or division or span
+ @param settings object - the new settings to use for this date picker instance (anonymous) */
+ _attachDatepicker: function(target, settings) {
+ // check for settings on the control itself - in namespace 'date:'
+ var inlineSettings = null;
+ for (var attrName in this._defaults) {
+ var attrValue = target.getAttribute('date:' + attrName);
+ if (attrValue) {
+ inlineSettings = inlineSettings || {};
+ try {
+ inlineSettings[attrName] = eval(attrValue);
+ } catch (err) {
+ inlineSettings[attrName] = attrValue;
+ }
+ }
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ var inline = (nodeName == 'div' || nodeName == 'span');
+ if (!target.id) {
+ this.uuid += 1;
+ target.id = 'dp' + this.uuid;
+ }
+ var inst = this._newInst($(target), inline);
+ inst.settings = $.extend({}, settings || {}, inlineSettings || {});
+ if (nodeName == 'input') {
+ this._connectDatepicker(target, inst);
+ } else if (inline) {
+ this._inlineDatepicker(target, inst);
+ }
+ },
+
+ /* Create a new instance object. */
+ _newInst: function(target, inline) {
+ var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
+ return {id: id, input: target, // associated target
+ selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+ drawMonth: 0, drawYear: 0, // month being drawn
+ inline: inline, // is datepicker inline or not
+ dpDiv: (!inline ? this.dpDiv : // presentation div
+ $('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))};
+ },
+
+ /* Attach the date picker to an input field. */
+ _connectDatepicker: function(target, inst) {
+ var input = $(target);
+ inst.append = $([]);
+ inst.trigger = $([]);
+ if (input.hasClass(this.markerClassName))
+ return;
+ this._attachments(input, inst);
+ input.addClass(this.markerClassName).keydown(this._doKeyDown).
+ keypress(this._doKeyPress).keyup(this._doKeyUp).
+ bind("setData.datepicker", function(event, key, value) {
+ inst.settings[key] = value;
+ }).bind("getData.datepicker", function(event, key) {
+ return this._get(inst, key);
+ });
+ this._autoSize(inst);
+ $.data(target, PROP_NAME, inst);
+ },
+
+ /* Make attachments based on settings. */
+ _attachments: function(input, inst) {
+ var appendText = this._get(inst, 'appendText');
+ var isRTL = this._get(inst, 'isRTL');
+ if (inst.append)
+ inst.append.remove();
+ if (appendText) {
+ inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
+ input[isRTL ? 'before' : 'after'](inst.append);
+ }
+ input.unbind('focus', this._showDatepicker);
+ if (inst.trigger)
+ inst.trigger.remove();
+ var showOn = this._get(inst, 'showOn');
+ if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
+ input.focus(this._showDatepicker);
+ if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
+ var buttonText = this._get(inst, 'buttonText');
+ var buttonImage = this._get(inst, 'buttonImage');
+ inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
+ $('<img/>').addClass(this._triggerClass).
+ attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
+ $('<button type="button"></button>').addClass(this._triggerClass).
+ html(buttonImage == '' ? buttonText : $('<img/>').attr(
+ { src:buttonImage, alt:buttonText, title:buttonText })));
+ input[isRTL ? 'before' : 'after'](inst.trigger);
+ inst.trigger.click(function() {
+ if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
+ $.datepicker._hideDatepicker();
+ else
+ $.datepicker._showDatepicker(input[0]);
+ return false;
+ });
+ }
+ },
+
+ /* Apply the maximum length for the date format. */
+ _autoSize: function(inst) {
+ if (this._get(inst, 'autoSize') && !inst.inline) {
+ var date = new Date(2009, 12 - 1, 20); // Ensure double digits
+ var dateFormat = this._get(inst, 'dateFormat');
+ if (dateFormat.match(/[DM]/)) {
+ var findMax = function(names) {
+ var max = 0;
+ var maxI = 0;
+ for (var i = 0; i < names.length; i++) {
+ if (names[i].length > max) {
+ max = names[i].length;
+ maxI = i;
+ }
+ }
+ return maxI;
+ };
+ date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
+ 'monthNames' : 'monthNamesShort'))));
+ date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
+ 'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
+ }
+ inst.input.attr('size', this._formatDate(inst, date).length);
+ }
+ },
+
+ /* Attach an inline date picker to a div. */
+ _inlineDatepicker: function(target, inst) {
+ var divSpan = $(target);
+ if (divSpan.hasClass(this.markerClassName))
+ return;
+ divSpan.addClass(this.markerClassName).append(inst.dpDiv).
+ bind("setData.datepicker", function(event, key, value){
+ inst.settings[key] = value;
+ }).bind("getData.datepicker", function(event, key){
+ return this._get(inst, key);
+ });
+ $.data(target, PROP_NAME, inst);
+ this._setDate(inst, this._getDefaultDate(inst), true);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ inst.dpDiv.show();
+ },
+
+ /* Pop-up the date picker in a "dialog" box.
+ @param input element - ignored
+ @param date string or Date - the initial date to display
+ @param onSelect function - the function to call when a date is selected
+ @param settings object - update the dialog date picker instance's settings (anonymous object)
+ @param pos int[2] - coordinates for the dialog's position within the screen or
+ event - with x/y coordinates or
+ leave empty for default (screen centre)
+ @return the manager object */
+ _dialogDatepicker: function(input, date, onSelect, settings, pos) {
+ var inst = this._dialogInst; // internal instance
+ if (!inst) {
+ this.uuid += 1;
+ var id = 'dp' + this.uuid;
+ this._dialogInput = $('<input type="text" id="' + id +
+ '" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');
+ this._dialogInput.keydown(this._doKeyDown);
+ $('body').append(this._dialogInput);
+ inst = this._dialogInst = this._newInst(this._dialogInput, false);
+ inst.settings = {};
+ $.data(this._dialogInput[0], PROP_NAME, inst);
+ }
+ extendRemove(inst.settings, settings || {});
+ date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
+ this._dialogInput.val(date);
+
+ this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
+ if (!this._pos) {
+ var browserWidth = document.documentElement.clientWidth;
+ var browserHeight = document.documentElement.clientHeight;
+ var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+ var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+ this._pos = // should use actual width/height below
+ [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
+ }
+
+ // move input on screen for focus, but hidden behind dialog
+ this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
+ inst.settings.onSelect = onSelect;
+ this._inDialog = true;
+ this.dpDiv.addClass(this._dialogClass);
+ this._showDatepicker(this._dialogInput[0]);
+ if ($.blockUI)
+ $.blockUI(this.dpDiv);
+ $.data(this._dialogInput[0], PROP_NAME, inst);
+ return this;
+ },
+
+ /* Detach a datepicker from its control.
+ @param target element - the target input field or division or span */
+ _destroyDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ $.removeData(target, PROP_NAME);
+ if (nodeName == 'input') {
+ inst.append.remove();
+ inst.trigger.remove();
+ $target.removeClass(this.markerClassName).
+ unbind('focus', this._showDatepicker).
+ unbind('keydown', this._doKeyDown).
+ unbind('keypress', this._doKeyPress).
+ unbind('keyup', this._doKeyUp);
+ } else if (nodeName == 'div' || nodeName == 'span')
+ $target.removeClass(this.markerClassName).empty();
+ },
+
+ /* Enable the date picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _enableDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = false;
+ inst.trigger.filter('button').
+ each(function() { this.disabled = false; }).end().
+ filter('img').css({opacity: '1.0', cursor: ''});
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().removeClass('ui-state-disabled');
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target ? null : value); }); // delete entry
+ },
+
+ /* Disable the date picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _disableDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = true;
+ inst.trigger.filter('button').
+ each(function() { this.disabled = true; }).end().
+ filter('img').css({opacity: '0.5', cursor: 'default'});
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().addClass('ui-state-disabled');
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target ? null : value); }); // delete entry
+ this._disabledInputs[this._disabledInputs.length] = target;
+ },
+
+ /* Is the first field in a jQuery collection disabled as a datepicker?
+ @param target element - the target input field or division or span
+ @return boolean - true if disabled, false if enabled */
+ _isDisabledDatepicker: function(target) {
+ if (!target) {
+ return false;
+ }
+ for (var i = 0; i < this._disabledInputs.length; i++) {
+ if (this._disabledInputs[i] == target)
+ return true;
+ }
+ return false;
+ },
+
+ /* Retrieve the instance data for the target control.
+ @param target element - the target input field or division or span
+ @return object - the associated instance data
+ @throws error if a jQuery problem getting data */
+ _getInst: function(target) {
+ try {
+ return $.data(target, PROP_NAME);
+ }
+ catch (err) {
+ throw 'Missing instance data for this datepicker';
+ }
+ },
+
+ /* Update or retrieve the settings for a date picker attached to an input field or division.
+ @param target element - the target input field or division or span
+ @param name object - the new settings to update or
+ string - the name of the setting to change or retrieve,
+ when retrieving also 'all' for all instance settings or
+ 'defaults' for all global defaults
+ @param value any - the new value for the setting
+ (omit if above is an object or to retrieve a value) */
+ _optionDatepicker: function(target, name, value) {
+ var inst = this._getInst(target);
+ if (arguments.length == 2 && typeof name == 'string') {
+ return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
+ (inst ? (name == 'all' ? $.extend({}, inst.settings) :
+ this._get(inst, name)) : null));
+ }
+ var settings = name || {};
+ if (typeof name == 'string') {
+ settings = {};
+ settings[name] = value;
+ }
+ if (inst) {
+ if (this._curInst == inst) {
+ this._hideDatepicker();
+ }
+ var date = this._getDateDatepicker(target, true);
+ extendRemove(inst.settings, settings);
+ this._attachments($(target), inst);
+ this._autoSize(inst);
+ this._setDateDatepicker(target, date);
+ this._updateDatepicker(inst);
+ }
+ },
+
+ // change method deprecated
+ _changeDatepicker: function(target, name, value) {
+ this._optionDatepicker(target, name, value);
+ },
+
+ /* Redraw the date picker attached to an input field or division.
+ @param target element - the target input field or division or span */
+ _refreshDatepicker: function(target) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._updateDatepicker(inst);
+ }
+ },
+
+ /* Set the dates for a jQuery selection.
+ @param target element - the target input field or division or span
+ @param date Date - the new date */
+ _setDateDatepicker: function(target, date) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._setDate(inst, date);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ }
+ },
+
+ /* Get the date(s) for the first entry in a jQuery selection.
+ @param target element - the target input field or division or span
+ @param noDefault boolean - true if no default date is to be used
+ @return Date - the current date */
+ _getDateDatepicker: function(target, noDefault) {
+ var inst = this._getInst(target);
+ if (inst && !inst.inline)
+ this._setDateFromField(inst, noDefault);
+ return (inst ? this._getDate(inst) : null);
+ },
+
+ /* Handle keystrokes. */
+ _doKeyDown: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ var handled = true;
+ var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
+ inst._keyEvent = true;
+ if ($.datepicker._datepickerShowing)
+ switch (event.keyCode) {
+ case 9: $.datepicker._hideDatepicker();
+ handled = false;
+ break; // hide on tab out
+ case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' +
+ $.datepicker._currentClass + ')', inst.dpDiv);
+ if (sel[0])
+ $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
+ else
+ $.datepicker._hideDatepicker();
+ return false; // don't submit the form
+ break; // select the value on enter
+ case 27: $.datepicker._hideDatepicker();
+ break; // hide on escape
+ case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, 'stepBigMonths') :
+ -$.datepicker._get(inst, 'stepMonths')), 'M');
+ break; // previous month/year on page up/+ ctrl
+ case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, 'stepBigMonths') :
+ +$.datepicker._get(inst, 'stepMonths')), 'M');
+ break; // next month/year on page down/+ ctrl
+ case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
+ handled = event.ctrlKey || event.metaKey;
+ break; // clear on ctrl or command +end
+ case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
+ handled = event.ctrlKey || event.metaKey;
+ break; // current on ctrl or command +home
+ case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
+ handled = event.ctrlKey || event.metaKey;
+ // -1 day on ctrl or command +left
+ if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, 'stepBigMonths') :
+ -$.datepicker._get(inst, 'stepMonths')), 'M');
+ // next month/year on alt +left on Mac
+ break;
+ case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
+ handled = event.ctrlKey || event.metaKey;
+ break; // -1 week on ctrl or command +up
+ case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
+ handled = event.ctrlKey || event.metaKey;
+ // +1 day on ctrl or command +right
+ if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, 'stepBigMonths') :
+ +$.datepicker._get(inst, 'stepMonths')), 'M');
+ // next month/year on alt +right
+ break;
+ case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
+ handled = event.ctrlKey || event.metaKey;
+ break; // +1 week on ctrl or command +down
+ default: handled = false;
+ }
+ else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
+ $.datepicker._showDatepicker(this);
+ else {
+ handled = false;
+ }
+ if (handled) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /* Filter entered characters - based on date format. */
+ _doKeyPress: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ if ($.datepicker._get(inst, 'constrainInput')) {
+ var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
+ var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
+ return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
+ }
+ },
+
+ /* Synchronise manual entry and field/alternate field. */
+ _doKeyUp: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ if (inst.input.val() != inst.lastVal) {
+ try {
+ var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+ (inst.input ? inst.input.val() : null),
+ $.datepicker._getFormatConfig(inst));
+ if (date) { // only if valid
+ $.datepicker._setDateFromField(inst);
+ $.datepicker._updateAlternate(inst);
+ $.datepicker._updateDatepicker(inst);
+ }
+ }
+ catch (event) {
+ $.datepicker.log(event);
+ }
+ }
+ return true;
+ },
+
+ /* Pop-up the date picker for a given input field.
+ @param input element - the input field attached to the date picker or
+ event - if triggered by focus */
+ _showDatepicker: function(input) {
+ input = input.target || input;
+ if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
+ input = $('input', input.parentNode)[0];
+ if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
+ return;
+ var inst = $.datepicker._getInst(input);
+ if ($.datepicker._curInst && $.datepicker._curInst != inst) {
+ $.datepicker._curInst.dpDiv.stop(true, true);
+ }
+ var beforeShow = $.datepicker._get(inst, 'beforeShow');
+ extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
+ inst.lastVal = null;
+ $.datepicker._lastInput = input;
+ $.datepicker._setDateFromField(inst);
+ if ($.datepicker._inDialog) // hide cursor
+ input.value = '';
+ if (!$.datepicker._pos) { // position below input
+ $.datepicker._pos = $.datepicker._findPos(input);
+ $.datepicker._pos[1] += input.offsetHeight; // add the height
+ }
+ var isFixed = false;
+ $(input).parents().each(function() {
+ isFixed |= $(this).css('position') == 'fixed';
+ return !isFixed;
+ });
+ if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
+ $.datepicker._pos[0] -= document.documentElement.scrollLeft;
+ $.datepicker._pos[1] -= document.documentElement.scrollTop;
+ }
+ var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
+ $.datepicker._pos = null;
+ //to avoid flashes on Firefox
+ inst.dpDiv.empty();
+ // determine sizing offscreen
+ inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
+ $.datepicker._updateDatepicker(inst);
+ // fix width for dynamic number of date pickers
+ // and adjust position before showing
+ offset = $.datepicker._checkOffset(inst, offset, isFixed);
+ inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
+ 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
+ left: offset.left + 'px', top: offset.top + 'px'});
+ if (!inst.inline) {
+ var showAnim = $.datepicker._get(inst, 'showAnim');
+ var duration = $.datepicker._get(inst, 'duration');
+ var postProcess = function() {
+ $.datepicker._datepickerShowing = true;
+ var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+ if( !! cover.length ){
+ var borders = $.datepicker._getBorders(inst.dpDiv);
+ cover.css({left: -borders[0], top: -borders[1],
+ width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
+ }
+ };
+ inst.dpDiv.zIndex($(input).zIndex()+1);
+ if ($.effects && $.effects[showAnim])
+ inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+ else
+ inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
+ if (!showAnim || !duration)
+ postProcess();
+ if (inst.input.is(':visible') && !inst.input.is(':disabled'))
+ inst.input.focus();
+ $.datepicker._curInst = inst;
+ }
+ },
+
+ /* Generate the date picker content. */
+ _updateDatepicker: function(inst) {
+ var self = this;
+ var borders = $.datepicker._getBorders(inst.dpDiv);
+ inst.dpDiv.empty().append(this._generateHTML(inst));
+ var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+ if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
+ cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
+ }
+ inst.dpDiv.find('button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a')
+ .bind('mouseout', function(){
+ $(this).removeClass('ui-state-hover');
+ if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
+ if(this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
+ })
+ .bind('mouseover', function(){
+ if (!self._isDisabledDatepicker( inst.inline ? inst.dpDiv.parent()[0] : inst.input[0])) {
+ $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
+ $(this).addClass('ui-state-hover');
+ if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
+ if(this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
+ }
+ })
+ .end()
+ .find('.' + this._dayOverClass + ' a')
+ .trigger('mouseover')
+ .end();
+ var numMonths = this._getNumberOfMonths(inst);
+ var cols = numMonths[1];
+ var width = 17;
+ if (cols > 1)
+ inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
+ else
+ inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
+ inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
+ 'Class']('ui-datepicker-multi');
+ inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
+ 'Class']('ui-datepicker-rtl');
+ if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
+ // #6694 - don't focus the input if it's already focused
+ // this breaks the change event in IE
+ inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
+ inst.input.focus();
+ // deffered render of the years select (to avoid flashes on Firefox)
+ if( inst.yearshtml ){
+ var origyearshtml = inst.yearshtml;
+ setTimeout(function(){
+ //assure that inst.yearshtml didn't change.
+ if( origyearshtml === inst.yearshtml ){
+ inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
+ }
+ origyearshtml = inst.yearshtml = null;
+ }, 0);
+ }
+ },
+
+ /* Retrieve the size of left and top borders for an element.
+ @param elem (jQuery object) the element of interest
+ @return (number[2]) the left and top borders */
+ _getBorders: function(elem) {
+ var convert = function(value) {
+ return {thin: 1, medium: 2, thick: 3}[value] || value;
+ };
+ return [parseFloat(convert(elem.css('border-left-width'))),
+ parseFloat(convert(elem.css('border-top-width')))];
+ },
+
+ /* Check positioning to remain on screen. */
+ _checkOffset: function(inst, offset, isFixed) {
+ var dpWidth = inst.dpDiv.outerWidth();
+ var dpHeight = inst.dpDiv.outerHeight();
+ var inputWidth = inst.input ? inst.input.outerWidth() : 0;
+ var inputHeight = inst.input ? inst.input.outerHeight() : 0;
+ var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
+ var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
+
+ offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
+ offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
+ offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
+
+ // now check if datepicker is showing outside window viewport - move to a better place if so.
+ offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
+ Math.abs(offset.left + dpWidth - viewWidth) : 0);
+ offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
+ Math.abs(dpHeight + inputHeight) : 0);
+
+ return offset;
+ },
+
+ /* Find an object's position on the screen. */
+ _findPos: function(obj) {
+ var inst = this._getInst(obj);
+ var isRTL = this._get(inst, 'isRTL');
+ while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
+ obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+ }
+ var position = $(obj).offset();
+ return [position.left, position.top];
+ },
+
+ /* Hide the date picker from view.
+ @param input element - the input field attached to the date picker */
+ _hideDatepicker: function(input) {
+ var inst = this._curInst;
+ if (!inst || (input && inst != $.data(input, PROP_NAME)))
+ return;
+ if (this._datepickerShowing) {
+ var showAnim = this._get(inst, 'showAnim');
+ var duration = this._get(inst, 'duration');
+ var postProcess = function() {
+ $.datepicker._tidyDialog(inst);
+ this._curInst = null;
+ };
+ if ($.effects && $.effects[showAnim])
+ inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+ else
+ inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
+ (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
+ if (!showAnim)
+ postProcess();
+ var onClose = this._get(inst, 'onClose');
+ if (onClose)
+ onClose.apply((inst.input ? inst.input[0] : null),
+ [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback
+ this._datepickerShowing = false;
+ this._lastInput = null;
+ if (this._inDialog) {
+ this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
+ if ($.blockUI) {
+ $.unblockUI();
+ $('body').append(this.dpDiv);
+ }
+ }
+ this._inDialog = false;
+ }
+ },
+
+ /* Tidy up after a dialog display. */
+ _tidyDialog: function(inst) {
+ inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
+ },
+
+ /* Close date picker if clicked elsewhere. */
+ _checkExternalClick: function(event) {
+ if (!$.datepicker._curInst)
+ return;
+ var $target = $(event.target);
+ if ($target[0].id != $.datepicker._mainDivId &&
+ $target.parents('#' + $.datepicker._mainDivId).length == 0 &&
+ !$target.hasClass($.datepicker.markerClassName) &&
+ !$target.hasClass($.datepicker._triggerClass) &&
+ $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
+ $.datepicker._hideDatepicker();
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustDate: function(id, offset, period) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (this._isDisabledDatepicker(target[0])) {
+ return;
+ }
+ this._adjustInstDate(inst, offset +
+ (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
+ period);
+ this._updateDatepicker(inst);
+ },
+
+ /* Action for current link. */
+ _gotoToday: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
+ inst.selectedDay = inst.currentDay;
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+ inst.drawYear = inst.selectedYear = inst.currentYear;
+ }
+ else {
+ var date = new Date();
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ }
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Action for selecting a new month/year. */
+ _selectMonthYear: function(id, select, period) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ inst._selectingMonthYear = false;
+ inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
+ inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
+ parseInt(select.options[select.selectedIndex].value,10);
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Restore input focus after not changing month/year. */
+ _clickMonthYear: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (inst.input && inst._selectingMonthYear) {
+ setTimeout(function() {
+ inst.input.focus();
+ }, 0);
+ }
+ inst._selectingMonthYear = !inst._selectingMonthYear;
+ },
+
+ /* Action for selecting a day. */
+ _selectDay: function(id, month, year, td) {
+ var target = $(id);
+ if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
+ return;
+ }
+ var inst = this._getInst(target[0]);
+ inst.selectedDay = inst.currentDay = $('a', td).html();
+ inst.selectedMonth = inst.currentMonth = month;
+ inst.selectedYear = inst.currentYear = year;
+ this._selectDate(id, this._formatDate(inst,
+ inst.currentDay, inst.currentMonth, inst.currentYear));
+ },
+
+ /* Erase the input field and hide the date picker. */
+ _clearDate: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ this._selectDate(target, '');
+ },
+
+ /* Update the input field with the selected date. */
+ _selectDate: function(id, dateStr) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+ if (inst.input)
+ inst.input.val(dateStr);
+ this._updateAlternate(inst);
+ var onSelect = this._get(inst, 'onSelect');
+ if (onSelect)
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback
+ else if (inst.input)
+ inst.input.trigger('change'); // fire the change event
+ if (inst.inline)
+ this._updateDatepicker(inst);
+ else {
+ this._hideDatepicker();
+ this._lastInput = inst.input[0];
+ if (typeof(inst.input[0]) != 'object')
+ inst.input.focus(); // restore focus
+ this._lastInput = null;
+ }
+ },
+
+ /* Update any alternate field to synchronise with the main field. */
+ _updateAlternate: function(inst) {
+ var altField = this._get(inst, 'altField');
+ if (altField) { // update alternate field too
+ var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
+ var date = this._getDate(inst);
+ var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
+ $(altField).each(function() { $(this).val(dateStr); });
+ }
+ },
+
+ /* Set as beforeShowDay function to prevent selection of weekends.
+ @param date Date - the date to customise
+ @return [boolean, string] - is this date selectable?, what is its CSS class? */
+ noWeekends: function(date) {
+ var day = date.getDay();
+ return [(day > 0 && day < 6), ''];
+ },
+
+ /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+ @param date Date - the date to get the week for
+ @return number - the number of the week within the year that contains this date */
+ iso8601Week: function(date) {
+ var checkDate = new Date(date.getTime());
+ // Find Thursday of this week starting on Monday
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+ var time = checkDate.getTime();
+ checkDate.setMonth(0); // Compare with Jan 1
+ checkDate.setDate(1);
+ return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+ },
+
+ /* Parse a string value into a date object.
+ See formatDate below for the possible formats.
+
+ @param format string - the expected format of the date
+ @param value string - the date in the above format
+ @param settings Object - attributes include:
+ shortYearCutoff number - the cutoff year for determining the century (optional)
+ dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ dayNames string[7] - names of the days from Sunday (optional)
+ monthNamesShort string[12] - abbreviated names of the months (optional)
+ monthNames string[12] - names of the months (optional)
+ @return Date - the extracted date value or null if value is blank */
+ parseDate: function (format, value, settings) {
+ if (format == null || value == null)
+ throw 'Invalid arguments';
+ value = (typeof value == 'object' ? value.toString() : value + '');
+ if (value == '')
+ return null;
+ var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
+ shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+ var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+ var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+ var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+ var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+ var year = -1;
+ var month = -1;
+ var day = -1;
+ var doy = -1;
+ var literal = false;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ // Extract a number from the string value
+ var getNumber = function(match) {
+ var isDoubled = lookAhead(match);
+ var size = (match == '@' ? 14 : (match == '!' ? 20 :
+ (match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
+ var digits = new RegExp('^\\d{1,' + size + '}');
+ var num = value.substring(iValue).match(digits);
+ if (!num)
+ throw 'Missing number at position ' + iValue;
+ iValue += num[0].length;
+ return parseInt(num[0], 10);
+ };
+ // Extract a name from the string value and convert to an index
+ var getName = function(match, shortNames, longNames) {
+ var names = (lookAhead(match) ? longNames : shortNames);
+ for (var i = 0; i < names.length; i++) {
+ if (value.substr(iValue, names[i].length).toLowerCase() == names[i].toLowerCase()) {
+ iValue += names[i].length;
+ return i + 1;
+ }
+ }
+ throw 'Unknown name at position ' + iValue;
+ };
+ // Confirm that a literal character matches the string value
+ var checkLiteral = function() {
+ if (value.charAt(iValue) != format.charAt(iFormat))
+ throw 'Unexpected literal at position ' + iValue;
+ iValue++;
+ };
+ var iValue = 0;
+ for (var iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ checkLiteral();
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd':
+ day = getNumber('d');
+ break;
+ case 'D':
+ getName('D', dayNamesShort, dayNames);
+ break;
+ case 'o':
+ doy = getNumber('o');
+ break;
+ case 'm':
+ month = getNumber('m');
+ break;
+ case 'M':
+ month = getName('M', monthNamesShort, monthNames);
+ break;
+ case 'y':
+ year = getNumber('y');
+ break;
+ case '@':
+ var date = new Date(getNumber('@'));
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case '!':
+ var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case "'":
+ if (lookAhead("'"))
+ checkLiteral();
+ else
+ literal = true;
+ break;
+ default:
+ checkLiteral();
+ }
+ }
+ if (year == -1)
+ year = new Date().getFullYear();
+ else if (year < 100)
+ year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+ (year <= shortYearCutoff ? 0 : -100);
+ if (doy > -1) {
+ month = 1;
+ day = doy;
+ do {
+ var dim = this._getDaysInMonth(year, month - 1);
+ if (day <= dim)
+ break;
+ month++;
+ day -= dim;
+ } while (true);
+ }
+ var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
+ if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
+ throw 'Invalid date'; // E.g. 31/02/*
+ return date;
+ },
+
+ /* Standard date formats. */
+ ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
+ COOKIE: 'D, dd M yy',
+ ISO_8601: 'yy-mm-dd',
+ RFC_822: 'D, d M y',
+ RFC_850: 'DD, dd-M-y',
+ RFC_1036: 'D, d M y',
+ RFC_1123: 'D, d M yy',
+ RFC_2822: 'D, d M yy',
+ RSS: 'D, d M y', // RFC 822
+ TICKS: '!',
+ TIMESTAMP: '@',
+ W3C: 'yy-mm-dd', // ISO 8601
+
+ _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
+ Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
+
+ /* Format a date object into a string value.
+ The format can be combinations of the following:
+ d - day of month (no leading zero)
+ dd - day of month (two digit)
+ o - day of year (no leading zeros)
+ oo - day of year (three digit)
+ D - day name short
+ DD - day name long
+ m - month of year (no leading zero)
+ mm - month of year (two digit)
+ M - month name short
+ MM - month name long
+ y - year (two digit)
+ yy - year (four digit)
+ @ - Unix timestamp (ms since 01/01/1970)
+ ! - Windows ticks (100ns since 01/01/0001)
+ '...' - literal text
+ '' - single quote
+
+ @param format string - the desired format of the date
+ @param date Date - the date value to format
+ @param settings Object - attributes include:
+ dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ dayNames string[7] - names of the days from Sunday (optional)
+ monthNamesShort string[12] - abbreviated names of the months (optional)
+ monthNames string[12] - names of the months (optional)
+ @return string - the date in the above format */
+ formatDate: function (format, date, settings) {
+ if (!date)
+ return '';
+ var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+ var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+ var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+ var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ // Format a number, with leading zero if necessary
+ var formatNumber = function(match, value, len) {
+ var num = '' + value;
+ if (lookAhead(match))
+ while (num.length < len)
+ num = '0' + num;
+ return num;
+ };
+ // Format a name, short or long as requested
+ var formatName = function(match, value, shortNames, longNames) {
+ return (lookAhead(match) ? longNames[value] : shortNames[value]);
+ };
+ var output = '';
+ var literal = false;
+ if (date)
+ for (var iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ output += format.charAt(iFormat);
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd':
+ output += formatNumber('d', date.getDate(), 2);
+ break;
+ case 'D':
+ output += formatName('D', date.getDay(), dayNamesShort, dayNames);
+ break;
+ case 'o':
+ output += formatNumber('o',
+ (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3);
+ break;
+ case 'm':
+ output += formatNumber('m', date.getMonth() + 1, 2);
+ break;
+ case 'M':
+ output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
+ break;
+ case 'y':
+ output += (lookAhead('y') ? date.getFullYear() :
+ (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
+ break;
+ case '@':
+ output += date.getTime();
+ break;
+ case '!':
+ output += date.getTime() * 10000 + this._ticksTo1970;
+ break;
+ case "'":
+ if (lookAhead("'"))
+ output += "'";
+ else
+ literal = true;
+ break;
+ default:
+ output += format.charAt(iFormat);
+ }
+ }
+ return output;
+ },
+
+ /* Extract all possible characters from the date format. */
+ _possibleChars: function (format) {
+ var chars = '';
+ var literal = false;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ for (var iFormat = 0; iFormat < format.length; iFormat++)
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ chars += format.charAt(iFormat);
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd': case 'm': case 'y': case '@':
+ chars += '0123456789';
+ break;
+ case 'D': case 'M':
+ return null; // Accept anything
+ case "'":
+ if (lookAhead("'"))
+ chars += "'";
+ else
+ literal = true;
+ break;
+ default:
+ chars += format.charAt(iFormat);
+ }
+ return chars;
+ },
+
+ /* Get a setting value, defaulting if necessary. */
+ _get: function(inst, name) {
+ return inst.settings[name] !== undefined ?
+ inst.settings[name] : this._defaults[name];
+ },
+
+ /* Parse existing date and initialise date picker. */
+ _setDateFromField: function(inst, noDefault) {
+ if (inst.input.val() == inst.lastVal) {
+ return;
+ }
+ var dateFormat = this._get(inst, 'dateFormat');
+ var dates = inst.lastVal = inst.input ? inst.input.val() : null;
+ var date, defaultDate;
+ date = defaultDate = this._getDefaultDate(inst);
+ var settings = this._getFormatConfig(inst);
+ try {
+ date = this.parseDate(dateFormat, dates, settings) || defaultDate;
+ } catch (event) {
+ this.log(event);
+ dates = (noDefault ? '' : dates);
+ }
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ inst.currentDay = (dates ? date.getDate() : 0);
+ inst.currentMonth = (dates ? date.getMonth() : 0);
+ inst.currentYear = (dates ? date.getFullYear() : 0);
+ this._adjustInstDate(inst);
+ },
+
+ /* Retrieve the default date shown on opening. */
+ _getDefaultDate: function(inst) {
+ return this._restrictMinMax(inst,
+ this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
+ },
+
+ /* A date may be specified as an exact value or a relative one. */
+ _determineDate: function(inst, date, defaultDate) {
+ var offsetNumeric = function(offset) {
+ var date = new Date();
+ date.setDate(date.getDate() + offset);
+ return date;
+ };
+ var offsetString = function(offset) {
+ try {
+ return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+ offset, $.datepicker._getFormatConfig(inst));
+ }
+ catch (e) {
+ // Ignore
+ }
+ var date = (offset.toLowerCase().match(/^c/) ?
+ $.datepicker._getDate(inst) : null) || new Date();
+ var year = date.getFullYear();
+ var month = date.getMonth();
+ var day = date.getDate();
+ var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
+ var matches = pattern.exec(offset);
+ while (matches) {
+ switch (matches[2] || 'd') {
+ case 'd' : case 'D' :
+ day += parseInt(matches[1],10); break;
+ case 'w' : case 'W' :
+ day += parseInt(matches[1],10) * 7; break;
+ case 'm' : case 'M' :
+ month += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ case 'y': case 'Y' :
+ year += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ }
+ matches = pattern.exec(offset);
+ }
+ return new Date(year, month, day);
+ };
+ var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
+ (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
+ newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
+ if (newDate) {
+ newDate.setHours(0);
+ newDate.setMinutes(0);
+ newDate.setSeconds(0);
+ newDate.setMilliseconds(0);
+ }
+ return this._daylightSavingAdjust(newDate);
+ },
+
+ /* Handle switch to/from daylight saving.
+ Hours may be non-zero on daylight saving cut-over:
+ > 12 when midnight changeover, but then cannot generate
+ midnight datetime, so jump to 1AM, otherwise reset.
+ @param date (Date) the date to check
+ @return (Date) the corrected date */
+ _daylightSavingAdjust: function(date) {
+ if (!date) return null;
+ date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
+ return date;
+ },
+
+ /* Set the date(s) directly. */
+ _setDate: function(inst, date, noChange) {
+ var clear = !date;
+ var origMonth = inst.selectedMonth;
+ var origYear = inst.selectedYear;
+ var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
+ inst.selectedDay = inst.currentDay = newDate.getDate();
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+ inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
+ if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
+ this._notifyChange(inst);
+ this._adjustInstDate(inst);
+ if (inst.input) {
+ inst.input.val(clear ? '' : this._formatDate(inst));
+ }
+ },
+
+ /* Retrieve the date(s) directly. */
+ _getDate: function(inst) {
+ var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
+ this._daylightSavingAdjust(new Date(
+ inst.currentYear, inst.currentMonth, inst.currentDay)));
+ return startDate;
+ },
+
+ /* Generate the HTML for the current state of the date picker. */
+ _generateHTML: function(inst) {
+ var today = new Date();
+ today = this._daylightSavingAdjust(
+ new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
+ var isRTL = this._get(inst, 'isRTL');
+ var showButtonPanel = this._get(inst, 'showButtonPanel');
+ var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
+ var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
+ var numMonths = this._getNumberOfMonths(inst);
+ var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
+ var stepMonths = this._get(inst, 'stepMonths');
+ var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
+ var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
+ new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ var drawMonth = inst.drawMonth - showCurrentAtPos;
+ var drawYear = inst.drawYear;
+ if (drawMonth < 0) {
+ drawMonth += 12;
+ drawYear--;
+ }
+ if (maxDate) {
+ var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
+ maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
+ maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
+ while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
+ drawMonth--;
+ if (drawMonth < 0) {
+ drawMonth = 11;
+ drawYear--;
+ }
+ }
+ }
+ inst.drawMonth = drawMonth;
+ inst.drawYear = drawYear;
+ var prevText = this._get(inst, 'prevText');
+ prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
+ this._getFormatConfig(inst)));
+ var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
+ '<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
+ ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
+ (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
+ var nextText = this._get(inst, 'nextText');
+ nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
+ this._getFormatConfig(inst)));
+ var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
+ '<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
+ ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
+ (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
+ var currentText = this._get(inst, 'currentText');
+ var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
+ currentText = (!navigationAsDateFormat ? currentText :
+ this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
+ var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : '');
+ var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
+ (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._gotoToday(\'#' + inst.id + '\');"' +
+ '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
+ var firstDay = parseInt(this._get(inst, 'firstDay'),10);
+ firstDay = (isNaN(firstDay) ? 0 : firstDay);
+ var showWeek = this._get(inst, 'showWeek');
+ var dayNames = this._get(inst, 'dayNames');
+ var dayNamesShort = this._get(inst, 'dayNamesShort');
+ var dayNamesMin = this._get(inst, 'dayNamesMin');
+ var monthNames = this._get(inst, 'monthNames');
+ var monthNamesShort = this._get(inst, 'monthNamesShort');
+ var beforeShowDay = this._get(inst, 'beforeShowDay');
+ var showOtherMonths = this._get(inst, 'showOtherMonths');
+ var selectOtherMonths = this._get(inst, 'selectOtherMonths');
+ var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
+ var defaultDate = this._getDefaultDate(inst);
+ var html = '';
+ for (var row = 0; row < numMonths[0]; row++) {
+ var group = '';
+ for (var col = 0; col < numMonths[1]; col++) {
+ var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
+ var cornerClass = ' ui-corner-all';
+ var calender = '';
+ if (isMultiMonth) {
+ calender += '<div class="ui-datepicker-group';
+ if (numMonths[1] > 1)
+ switch (col) {
+ case 0: calender += ' ui-datepicker-group-first';
+ cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
+ case numMonths[1]-1: calender += ' ui-datepicker-group-last';
+ cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
+ default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
+ }
+ calender += '">';
+ }
+ calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
+ (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
+ (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
+ this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
+ row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
+ '</div><table class="ui-datepicker-calendar"><thead>' +
+ '<tr>';
+ var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
+ for (var dow = 0; dow < 7; dow++) { // days of the week
+ var day = (dow + firstDay) % 7;
+ thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
+ '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
+ }
+ calender += thead + '</tr></thead><tbody>';
+ var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
+ if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
+ inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
+ var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
+ var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate
+ var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
+ for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
+ calender += '<tr>';
+ var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
+ this._get(inst, 'calculateWeek')(printDate) + '</td>');
+ for (var dow = 0; dow < 7; dow++) { // create date picker days
+ var daySettings = (beforeShowDay ?
+ beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
+ var otherMonth = (printDate.getMonth() != drawMonth);
+ var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
+ (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
+ tbody += '<td class="' +
+ ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
+ (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
+ ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
+ (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
+ // or defaultDate is current printedDate and defaultDate is selectedDate
+ ' ' + this._dayOverClass : '') + // highlight selected day
+ (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') + // highlight unselectable days
+ (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
+ (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
+ (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
+ ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
+ (unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
+ inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions
+ (otherMonth && !showOtherMonths ? ' ' : // display for other months
+ (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
+ (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
+ (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
+ (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
+ '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
+ printDate.setDate(printDate.getDate() + 1);
+ printDate = this._daylightSavingAdjust(printDate);
+ }
+ calender += tbody + '</tr>';
+ }
+ drawMonth++;
+ if (drawMonth > 11) {
+ drawMonth = 0;
+ drawYear++;
+ }
+ calender += '</tbody></table>' + (isMultiMonth ? '</div>' +
+ ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
+ group += calender;
+ }
+ html += group;
+ }
+ html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+ '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
+ inst._keyEvent = false;
+ return html;
+ },
+
+ /* Generate the month and year header. */
+ _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
+ secondary, monthNames, monthNamesShort) {
+ var changeMonth = this._get(inst, 'changeMonth');
+ var changeYear = this._get(inst, 'changeYear');
+ var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
+ var html = '<div class="ui-datepicker-title">';
+ var monthHtml = '';
+ // month selection
+ if (secondary || !changeMonth)
+ monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
+ else {
+ var inMinYear = (minDate && minDate.getFullYear() == drawYear);
+ var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
+ monthHtml += '<select class="ui-datepicker-month" ' +
+ 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
+ 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
+ '>';
+ for (var month = 0; month < 12; month++) {
+ if ((!inMinYear || month >= minDate.getMonth()) &&
+ (!inMaxYear || month <= maxDate.getMonth()))
+ monthHtml += '<option value="' + month + '"' +
+ (month == drawMonth ? ' selected="selected"' : '') +
+ '>' + monthNamesShort[month] + '</option>';
+ }
+ monthHtml += '</select>';
+ }
+ if (!showMonthAfterYear)
+ html += monthHtml + (secondary || !(changeMonth && changeYear) ? ' ' : '');
+ // year selection
+ inst.yearshtml = '';
+ if (secondary || !changeYear)
+ html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
+ else {
+ // determine range of years to display
+ var years = this._get(inst, 'yearRange').split(':');
+ var thisYear = new Date().getFullYear();
+ var determineYear = function(value) {
+ var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
+ (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
+ parseInt(value, 10)));
+ return (isNaN(year) ? thisYear : year);
+ };
+ var year = determineYear(years[0]);
+ var endYear = Math.max(year, determineYear(years[1] || ''));
+ year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
+ endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
+ inst.yearshtml += '<select class="ui-datepicker-year" ' +
+ 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
+ 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
+ '>';
+ for (; year <= endYear; year++) {
+ inst.yearshtml += '<option value="' + year + '"' +
+ (year == drawYear ? ' selected="selected"' : '') +
+ '>' + year + '</option>';
+ }
+ inst.yearshtml += '</select>';
+ //when showing there is no need for later update
+ if( ! $.browser.mozilla ){
+ html += inst.yearshtml;
+ inst.yearshtml = null;
+ } else {
+ // will be replaced later with inst.yearshtml
+ html += '<select class="ui-datepicker-year"><option value="' + drawYear + '" selected="selected">' + drawYear + '</option></select>';
+ }
+ }
+ html += this._get(inst, 'yearSuffix');
+ if (showMonthAfterYear)
+ html += (secondary || !(changeMonth && changeYear) ? ' ' : '') + monthHtml;
+ html += '</div>'; // Close datepicker_header
+ return html;
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustInstDate: function(inst, offset, period) {
+ var year = inst.drawYear + (period == 'Y' ? offset : 0);
+ var month = inst.drawMonth + (period == 'M' ? offset : 0);
+ var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
+ (period == 'D' ? offset : 0);
+ var date = this._restrictMinMax(inst,
+ this._daylightSavingAdjust(new Date(year, month, day)));
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ if (period == 'M' || period == 'Y')
+ this._notifyChange(inst);
+ },
+
+ /* Ensure a date is within any min/max bounds. */
+ _restrictMinMax: function(inst, date) {
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ var newDate = (minDate && date < minDate ? minDate : date);
+ newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
+ return newDate;
+ },
+
+ /* Notify change of month/year. */
+ _notifyChange: function(inst) {
+ var onChange = this._get(inst, 'onChangeMonthYear');
+ if (onChange)
+ onChange.apply((inst.input ? inst.input[0] : null),
+ [inst.selectedYear, inst.selectedMonth + 1, inst]);
+ },
+
+ /* Determine the number of months to show. */
+ _getNumberOfMonths: function(inst) {
+ var numMonths = this._get(inst, 'numberOfMonths');
+ return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
+ },
+
+ /* Determine the current maximum date - ensure no time components are set. */
+ _getMinMaxDate: function(inst, minMax) {
+ return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
+ },
+
+ /* Find the number of days in a given month. */
+ _getDaysInMonth: function(year, month) {
+ return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
+ },
+
+ /* Find the day of the week of the first of a month. */
+ _getFirstDayOfMonth: function(year, month) {
+ return new Date(year, month, 1).getDay();
+ },
+
+ /* Determines if we should allow a "next/prev" month display change. */
+ _canAdjustMonth: function(inst, offset, curYear, curMonth) {
+ var numMonths = this._getNumberOfMonths(inst);
+ var date = this._daylightSavingAdjust(new Date(curYear,
+ curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
+ if (offset < 0)
+ date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
+ return this._isInRange(inst, date);
+ },
+
+ /* Is the given date in the accepted range? */
+ _isInRange: function(inst, date) {
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ return ((!minDate || date.getTime() >= minDate.getTime()) &&
+ (!maxDate || date.getTime() <= maxDate.getTime()));
+ },
+
+ /* Provide the configuration settings for formatting/parsing. */
+ _getFormatConfig: function(inst) {
+ var shortYearCutoff = this._get(inst, 'shortYearCutoff');
+ shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+ return {shortYearCutoff: shortYearCutoff,
+ dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
+ monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
+ },
+
+ /* Format the given date for display. */
+ _formatDate: function(inst, day, month, year) {
+ if (!day) {
+ inst.currentDay = inst.selectedDay;
+ inst.currentMonth = inst.selectedMonth;
+ inst.currentYear = inst.selectedYear;
+ }
+ var date = (day ? (typeof day == 'object' ? day :
+ this._daylightSavingAdjust(new Date(year, month, day))) :
+ this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+ return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
+ }
+});
+
+/* jQuery extend now ignores nulls! */
+function extendRemove(target, props) {
+ $.extend(target, props);
+ for (var name in props)
+ if (props[name] == null || props[name] == undefined)
+ target[name] = props[name];
+ return target;
+};
+
+/* Determine whether an object is an array. */
+function isArray(a) {
+ return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
+ (a.constructor && a.constructor.toString().match(/\Array\(\)/))));
+};
+
+/* Invoke the datepicker functionality.
+ @param options string - a command, optionally followed by additional parameters or
+ Object - settings for attaching new datepicker functionality
+ @return jQuery object */
+$.fn.datepicker = function(options){
+
+ /* Verify an empty collection wasn't passed - Fixes #6976 */
+ if ( !this.length ) {
+ return this;
+ }
+
+ /* Initialise the date picker. */
+ if (!$.datepicker.initialized) {
+ $(document).mousedown($.datepicker._checkExternalClick).
+ find('body').append($.datepicker.dpDiv);
+ $.datepicker.initialized = true;
+ }
+
+ var otherArgs = Array.prototype.slice.call(arguments, 1);
+ if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
+ return $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
+ return $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ return this.each(function() {
+ typeof options == 'string' ?
+ $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this].concat(otherArgs)) :
+ $.datepicker._attachDatepicker(this, options);
+ });
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.8.10";
+
+// Workaround for #4055
+// Add another global to avoid noConflict issues with inline event handlers
+window['DP_jQuery_' + dpuuid] = $;
+
+})(jQuery);
+/*
+ * jQuery UI Progressbar 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.progressbar", {
+ options: {
+ value: 0,
+ max: 100
+ },
+
+ min: 0,
+
+ _create: function() {
+ this.element
+ .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .attr({
+ role: "progressbar",
+ "aria-valuemin": this.min,
+ "aria-valuemax": this.options.max,
+ "aria-valuenow": this._value()
+ });
+
+ this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
+ .appendTo( this.element );
+
+ this.oldValue = this._value();
+ this._refreshValue();
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-valuemin" )
+ .removeAttr( "aria-valuemax" )
+ .removeAttr( "aria-valuenow" );
+
+ this.valueDiv.remove();
+
+ $.Widget.prototype.destroy.apply( this, arguments );
+ },
+
+ value: function( newValue ) {
+ if ( newValue === undefined ) {
+ return this._value();
+ }
+
+ this._setOption( "value", newValue );
+ return this;
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "value" ) {
+ this.options.value = value;
+ this._refreshValue();
+ if ( this._value() === this.options.max ) {
+ this._trigger( "complete" );
+ }
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+ },
+
+ _value: function() {
+ var val = this.options.value;
+ // normalize invalid value
+ if ( typeof val !== "number" ) {
+ val = 0;
+ }
+ return Math.min( this.options.max, Math.max( this.min, val ) );
+ },
+
+ _percentage: function() {
+ return 100 * this._value() / this.options.max;
+ },
+
+ _refreshValue: function() {
+ var value = this.value();
+ var percentage = this._percentage();
+
+ if ( this.oldValue !== value ) {
+ this.oldValue = value;
+ this._trigger( "change" );
+ }
+
+ this.valueDiv
+ .toggleClass( "ui-corner-right", value === this.options.max )
+ .width( percentage.toFixed(0) + "%" );
+ this.element.attr( "aria-valuenow", value );
+ }
+});
+
+$.extend( $.ui.progressbar, {
+ version: "1.8.10"
+});
+
+})( jQuery );
+/*
+ * jQuery UI Effects 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+;jQuery.effects || (function($, undefined) {
+
+$.effects = {};
+
+
+
+/******************************************************************************/
+/****************************** COLOR ANIMATIONS ******************************/
+/******************************************************************************/
+
+// override the animation for color styles
+$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
+ 'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
+function(i, attr) {
+ $.fx.step[attr] = function(fx) {
+ if (!fx.colorInit) {
+ fx.start = getColor(fx.elem, attr);
+ fx.end = getRGB(fx.end);
+ fx.colorInit = true;
+ }
+
+ fx.elem.style[attr] = 'rgb(' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
+ };
+});
+
+// Color Conversion functions from highlightFade
+// By Blair Mitchelmore
+// http://jquery.offput.ca/highlightFade/
+
+// Parse strings looking for color tuples [255,255,255]
+function getRGB(color) {
+ var result;
+
+ // Check if we're already dealing with an array of colors
+ if ( color && color.constructor == Array && color.length == 3 )
+ return color;
+
+ // Look for rgb(num,num,num)
+ if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
+ return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
+
+ // Look for rgb(num%,num%,num%)
+ if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
+ return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
+
+ // Look for #a0b1c2
+ if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
+ return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+
+ // Look for #fff
+ if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
+ return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+
+ // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+ if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
+ return colors['transparent'];
+
+ // Otherwise, we're most likely dealing with a named color
+ return colors[$.trim(color).toLowerCase()];
+}
+
+function getColor(elem, attr) {
+ var color;
+
+ do {
+ color = $.curCSS(elem, attr);
+
+ // Keep going until we find an element that has color, or we hit the body
+ if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
+ break;
+
+ attr = "backgroundColor";
+ } while ( elem = elem.parentNode );
+
+ return getRGB(color);
+};
+
+// Some named colors to work with
+// From Interface by Stefan Petre
+// http://interface.eyecon.ro/
+
+var colors = {
+ aqua:[0,255,255],
+ azure:[240,255,255],
+ beige:[245,245,220],
+ black:[0,0,0],
+ blue:[0,0,255],
+ brown:[165,42,42],
+ cyan:[0,255,255],
+ darkblue:[0,0,139],
+ darkcyan:[0,139,139],
+ darkgrey:[169,169,169],
+ darkgreen:[0,100,0],
+ darkkhaki:[189,183,107],
+ darkmagenta:[139,0,139],
+ darkolivegreen:[85,107,47],
+ darkorange:[255,140,0],
+ darkorchid:[153,50,204],
+ darkred:[139,0,0],
+ darksalmon:[233,150,122],
+ darkviolet:[148,0,211],
+ fuchsia:[255,0,255],
+ gold:[255,215,0],
+ green:[0,128,0],
+ indigo:[75,0,130],
+ khaki:[240,230,140],
+ lightblue:[173,216,230],
+ lightcyan:[224,255,255],
+ lightgreen:[144,238,144],
+ lightgrey:[211,211,211],
+ lightpink:[255,182,193],
+ lightyellow:[255,255,224],
+ lime:[0,255,0],
+ magenta:[255,0,255],
+ maroon:[128,0,0],
+ navy:[0,0,128],
+ olive:[128,128,0],
+ orange:[255,165,0],
+ pink:[255,192,203],
+ purple:[128,0,128],
+ violet:[128,0,128],
+ red:[255,0,0],
+ silver:[192,192,192],
+ white:[255,255,255],
+ yellow:[255,255,0],
+ transparent: [255,255,255]
+};
+
+
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+
+var classAnimationActions = ['add', 'remove', 'toggle'],
+ shorthandStyles = {
+ border: 1,
+ borderBottom: 1,
+ borderColor: 1,
+ borderLeft: 1,
+ borderRight: 1,
+ borderTop: 1,
+ borderWidth: 1,
+ margin: 1,
+ padding: 1
+ };
+
+function getElementStyles() {
+ var style = document.defaultView
+ ? document.defaultView.getComputedStyle(this, null)
+ : this.currentStyle,
+ newStyle = {},
+ key,
+ camelCase;
+
+ // webkit enumerates style porperties
+ if (style && style.length && style[0] && style[style[0]]) {
+ var len = style.length;
+ while (len--) {
+ key = style[len];
+ if (typeof style[key] == 'string') {
+ camelCase = key.replace(/\-(\w)/g, function(all, letter){
+ return letter.toUpperCase();
+ });
+ newStyle[camelCase] = style[key];
+ }
+ }
+ } else {
+ for (key in style) {
+ if (typeof style[key] === 'string') {
+ newStyle[key] = style[key];
+ }
+ }
+ }
+
+ return newStyle;
+}
+
+function filterStyles(styles) {
+ var name, value;
+ for (name in styles) {
+ value = styles[name];
+ if (
+ // ignore null and undefined values
+ value == null ||
+ // ignore functions (when does this occur?)
+ $.isFunction(value) ||
+ // shorthand styles that need to be expanded
+ name in shorthandStyles ||
+ // ignore scrollbars (break in IE)
+ (/scrollbar/).test(name) ||
+
+ // only colors or values that can be converted to numbers
+ (!(/color/i).test(name) && isNaN(parseFloat(value)))
+ ) {
+ delete styles[name];
+ }
+ }
+
+ return styles;
+}
+
+function styleDifference(oldStyle, newStyle) {
+ var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
+ name;
+
+ for (name in newStyle) {
+ if (oldStyle[name] != newStyle[name]) {
+ diff[name] = newStyle[name];
+ }
+ }
+
+ return diff;
+}
+
+$.effects.animateClass = function(value, duration, easing, callback) {
+ if ($.isFunction(easing)) {
+ callback = easing;
+ easing = null;
+ }
+
+ return this.queue('fx', function() {
+ var that = $(this),
+ originalStyleAttr = that.attr('style') || ' ',
+ originalStyle = filterStyles(getElementStyles.call(this)),
+ newStyle,
+ className = that.attr('className');
+
+ $.each(classAnimationActions, function(i, action) {
+ if (value[action]) {
+ that[action + 'Class'](value[action]);
+ }
+ });
+ newStyle = filterStyles(getElementStyles.call(this));
+ that.attr('className', className);
+
+ that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() {
+ $.each(classAnimationActions, function(i, action) {
+ if (value[action]) { that[action + 'Class'](value[action]); }
+ });
+ // work around bug in IE by clearing the cssText before setting it
+ if (typeof that.attr('style') == 'object') {
+ that.attr('style').cssText = '';
+ that.attr('style').cssText = originalStyleAttr;
+ } else {
+ that.attr('style', originalStyleAttr);
+ }
+ if (callback) { callback.apply(this, arguments); }
+ });
+
+ // $.animate adds a function to the end of the queue
+ // but we want it at the front
+ var queue = $.queue(this),
+ anim = queue.splice(queue.length - 1, 1)[0];
+ queue.splice(1, 0, anim);
+ $.dequeue(this);
+ });
+};
+
+$.fn.extend({
+ _addClass: $.fn.addClass,
+ addClass: function(classNames, speed, easing, callback) {
+ return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
+ },
+
+ _removeClass: $.fn.removeClass,
+ removeClass: function(classNames,speed,easing,callback) {
+ return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
+ },
+
+ _toggleClass: $.fn.toggleClass,
+ toggleClass: function(classNames, force, speed, easing, callback) {
+ if ( typeof force == "boolean" || force === undefined ) {
+ if ( !speed ) {
+ // without speed parameter;
+ return this._toggleClass(classNames, force);
+ } else {
+ return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
+ }
+ } else {
+ // without switch parameter;
+ return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
+ }
+ },
+
+ switchClass: function(remove,add,speed,easing,callback) {
+ return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
+ }
+});
+
+
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+$.extend($.effects, {
+ version: "1.8.10",
+
+ // Saves a set of properties in a data storage
+ save: function(element, set) {
+ for(var i=0; i < set.length; i++) {
+ if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
+ }
+ },
+
+ // Restores a set of previously saved properties from a data storage
+ restore: function(element, set) {
+ for(var i=0; i < set.length; i++) {
+ if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
+ }
+ },
+
+ setMode: function(el, mode) {
+ if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
+ return mode;
+ },
+
+ getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
+ // this should be a little more flexible in the future to handle a string & hash
+ var y, x;
+ switch (origin[0]) {
+ case 'top': y = 0; break;
+ case 'middle': y = 0.5; break;
+ case 'bottom': y = 1; break;
+ default: y = origin[0] / original.height;
+ };
+ switch (origin[1]) {
+ case 'left': x = 0; break;
+ case 'center': x = 0.5; break;
+ case 'right': x = 1; break;
+ default: x = origin[1] / original.width;
+ };
+ return {x: x, y: y};
+ },
+
+ // Wraps the element around a wrapper that copies position properties
+ createWrapper: function(element) {
+
+ // if the element is already wrapped, return it
+ if (element.parent().is('.ui-effects-wrapper')) {
+ return element.parent();
+ }
+
+ // wrap the element
+ var props = {
+ width: element.outerWidth(true),
+ height: element.outerHeight(true),
+ 'float': element.css('float')
+ },
+ wrapper = $('<div></div>')
+ .addClass('ui-effects-wrapper')
+ .css({
+ fontSize: '100%',
+ background: 'transparent',
+ border: 'none',
+ margin: 0,
+ padding: 0
+ });
+
+ element.wrap(wrapper);
+ wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
+
+ // transfer positioning properties to the wrapper
+ if (element.css('position') == 'static') {
+ wrapper.css({ position: 'relative' });
+ element.css({ position: 'relative' });
+ } else {
+ $.extend(props, {
+ position: element.css('position'),
+ zIndex: element.css('z-index')
+ });
+ $.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
+ props[pos] = element.css(pos);
+ if (isNaN(parseInt(props[pos], 10))) {
+ props[pos] = 'auto';
+ }
+ });
+ element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
+ }
+
+ return wrapper.css(props).show();
+ },
+
+ removeWrapper: function(element) {
+ if (element.parent().is('.ui-effects-wrapper'))
+ return element.parent().replaceWith(element);
+ return element;
+ },
+
+ setTransition: function(element, list, factor, value) {
+ value = value || {};
+ $.each(list, function(i, x){
+ unit = element.cssUnit(x);
+ if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
+ });
+ return value;
+ }
+});
+
+
+function _normalizeArguments(effect, options, speed, callback) {
+ // shift params for method overloading
+ if (typeof effect == 'object') {
+ callback = options;
+ speed = null;
+ options = effect;
+ effect = options.effect;
+ }
+ if ($.isFunction(options)) {
+ callback = options;
+ speed = null;
+ options = {};
+ }
+ if (typeof options == 'number' || $.fx.speeds[options]) {
+ callback = speed;
+ speed = options;
+ options = {};
+ }
+ if ($.isFunction(speed)) {
+ callback = speed;
+ speed = null;
+ }
+
+ options = options || {};
+
+ speed = speed || options.duration;
+ speed = $.fx.off ? 0 : typeof speed == 'number'
+ ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
+
+ callback = callback || options.complete;
+
+ return [effect, options, speed, callback];
+}
+
+function standardSpeed( speed ) {
+ // valid standard speeds
+ if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
+ return true;
+ }
+
+ // invalid strings - treat as "normal" speed
+ if ( typeof speed === "string" && !$.effects[ speed ] ) {
+ return true;
+ }
+
+ return false;
+}
+
+$.fn.extend({
+ effect: function(effect, options, speed, callback) {
+ var args = _normalizeArguments.apply(this, arguments),
+ // TODO: make effects take actual parameters instead of a hash
+ args2 = {
+ options: args[1],
+ duration: args[2],
+ callback: args[3]
+ },
+ mode = args2.options.mode,
+ effectMethod = $.effects[effect];
+
+ if ( $.fx.off || !effectMethod ) {
+ // delegate to the original method (e.g., .show()) if possible
+ if ( mode ) {
+ return this[ mode ]( args2.duration, args2.callback );
+ } else {
+ return this.each(function() {
+ if ( args2.callback ) {
+ args2.callback.call( this );
+ }
+ });
+ }
+ }
+
+ return effectMethod.call(this, args2);
+ },
+
+ _show: $.fn.show,
+ show: function(speed) {
+ if ( standardSpeed( speed ) ) {
+ return this._show.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'show';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ _hide: $.fn.hide,
+ hide: function(speed) {
+ if ( standardSpeed( speed ) ) {
+ return this._hide.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'hide';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ // jQuery core overloads toggle and creates _toggle
+ __toggle: $.fn.toggle,
+ toggle: function(speed) {
+ if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
+ return this.__toggle.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'toggle';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ // helper functions
+ cssUnit: function(key) {
+ var style = this.css(key), val = [];
+ $.each( ['em','px','%','pt'], function(i, unit){
+ if(style.indexOf(unit) > 0)
+ val = [parseFloat(style), unit];
+ });
+ return val;
+ }
+});
+
+
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2008 George McGinley Smith
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+$.easing.jswing = $.easing.swing;
+
+$.extend($.easing,
+{
+ def: 'easeOutQuad',
+ swing: function (x, t, b, c, d) {
+ //alert($.easing.default);
+ return $.easing[$.easing.def](x, t, b, c, d);
+ },
+ easeInQuad: function (x, t, b, c, d) {
+ return c*(t/=d)*t + b;
+ },
+ easeOutQuad: function (x, t, b, c, d) {
+ return -c *(t/=d)*(t-2) + b;
+ },
+ easeInOutQuad: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t + b;
+ return -c/2 * ((--t)*(t-2) - 1) + b;
+ },
+ easeInCubic: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t + b;
+ },
+ easeOutCubic: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t + 1) + b;
+ },
+ easeInOutCubic: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t + b;
+ return c/2*((t-=2)*t*t + 2) + b;
+ },
+ easeInQuart: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t + b;
+ },
+ easeOutQuart: function (x, t, b, c, d) {
+ return -c * ((t=t/d-1)*t*t*t - 1) + b;
+ },
+ easeInOutQuart: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+ return -c/2 * ((t-=2)*t*t*t - 2) + b;
+ },
+ easeInQuint: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t*t + b;
+ },
+ easeOutQuint: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t*t*t + 1) + b;
+ },
+ easeInOutQuint: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+ return c/2*((t-=2)*t*t*t*t + 2) + b;
+ },
+ easeInSine: function (x, t, b, c, d) {
+ return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+ },
+ easeOutSine: function (x, t, b, c, d) {
+ return c * Math.sin(t/d * (Math.PI/2)) + b;
+ },
+ easeInOutSine: function (x, t, b, c, d) {
+ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+ },
+ easeInExpo: function (x, t, b, c, d) {
+ return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+ },
+ easeOutExpo: function (x, t, b, c, d) {
+ return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+ },
+ easeInOutExpo: function (x, t, b, c, d) {
+ if (t==0) return b;
+ if (t==d) return b+c;
+ if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+ return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+ },
+ easeInCirc: function (x, t, b, c, d) {
+ return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+ },
+ easeOutCirc: function (x, t, b, c, d) {
+ return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+ },
+ easeInOutCirc: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+ return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+ },
+ easeInElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ },
+ easeOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+ },
+ easeInOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+ },
+ easeInBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*(t/=d)*t*((s+1)*t - s) + b;
+ },
+ easeOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+ },
+ easeInOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+ return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+ },
+ easeInBounce: function (x, t, b, c, d) {
+ return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+ },
+ easeOutBounce: function (x, t, b, c, d) {
+ if ((t/=d) < (1/2.75)) {
+ return c*(7.5625*t*t) + b;
+ } else if (t < (2/2.75)) {
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+ } else if (t < (2.5/2.75)) {
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+ } else {
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+ }
+ },
+ easeInOutBounce: function (x, t, b, c, d) {
+ if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+ return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+ }
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2001 Robert Penner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+})(jQuery);
+/*
+ * jQuery UI Effects Blind 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.blind = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'vertical'; // Default direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var ref = (direction == 'vertical') ? 'height' : 'width';
+ var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
+ if(mode == 'show') wrapper.css(ref, 0); // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref] = mode == 'show' ? distance : 0;
+
+ // Animate
+ wrapper.animate(animation, o.duration, o.options.easing, function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ });
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Bounce 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.bounce = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var direction = o.options.direction || 'up'; // Default direction
+ var distance = o.options.distance || 20; // Default distance
+ var times = o.options.times || 5; // Default # of times
+ var speed = o.duration || 250; // Default speed per bounce
+ if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
+ if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+ if (mode == 'hide') distance = distance / (times * 2);
+ if (mode != 'hide') times--;
+
+ // Animate
+ if (mode == 'show') { // Show Bounce
+ var animation = {opacity: 1};
+ animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation, speed / 2, o.options.easing);
+ distance = distance / 2;
+ times--;
+ };
+ for (var i = 0; i < times; i++) { // Bounces
+ var animation1 = {}, animation2 = {};
+ animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
+ distance = (mode == 'hide') ? distance * 2 : distance / 2;
+ };
+ if (mode == 'hide') { // Last Bounce
+ var animation = {opacity: 0};
+ animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ el.animate(animation, speed / 2, o.options.easing, function(){
+ el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ } else {
+ var animation1 = {}, animation2 = {};
+ animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ };
+ el.queue('fx', function() { el.dequeue(); });
+ el.dequeue();
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Clip 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.clip = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right','height','width'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'vertical'; // Default direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var animate = el[0].tagName == 'IMG' ? wrapper : el;
+ var ref = {
+ size: (direction == 'vertical') ? 'height' : 'width',
+ position: (direction == 'vertical') ? 'top' : 'left'
+ };
+ var distance = (direction == 'vertical') ? animate.height() : animate.width();
+ if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref.size] = mode == 'show' ? distance : 0;
+ animation[ref.position] = mode == 'show' ? 0 : distance / 2;
+
+ // Animate
+ animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Drop 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.drop = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right','opacity'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default Direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
+ if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+
+ // Animation
+ var animation = {opacity: mode == 'show' ? 1 : 0};
+ animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+ // Animate
+ el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Explode 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.explode = function(o) {
+
+ return this.queue(function() {
+
+ var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+ var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+
+ o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
+ var el = $(this).show().css('visibility', 'hidden');
+ var offset = el.offset();
+
+ //Substract the margins - not fixing the problem yet.
+ offset.top -= parseInt(el.css("marginTop"),10) || 0;
+ offset.left -= parseInt(el.css("marginLeft"),10) || 0;
+
+ var width = el.outerWidth(true);
+ var height = el.outerHeight(true);
+
+ for(var i=0;i<rows;i++) { // =
+ for(var j=0;j<cells;j++) { // ||
+ el
+ .clone()
+ .appendTo('body')
+ .wrap('<div></div>')
+ .css({
+ position: 'absolute',
+ visibility: 'visible',
+ left: -j*(width/cells),
+ top: -i*(height/rows)
+ })
+ .parent()
+ .addClass('ui-effects-explode')
+ .css({
+ position: 'absolute',
+ overflow: 'hidden',
+ width: width/cells,
+ height: height/rows,
+ left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
+ top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
+ opacity: o.options.mode == 'show' ? 0 : 1
+ }).animate({
+ left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
+ top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
+ opacity: o.options.mode == 'show' ? 1 : 0
+ }, o.duration || 500);
+ }
+ }
+
+ // Set a timeout, to call the callback approx. when the other animations have finished
+ setTimeout(function() {
+
+ o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
+ if(o.callback) o.callback.apply(el[0]); // Callback
+ el.dequeue();
+
+ $('div.ui-effects-explode').remove();
+
+ }, o.duration || 500);
+
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Fade 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fade = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ mode = $.effects.setMode(elem, o.options.mode || 'hide');
+
+ elem.animate({ opacity: mode }, {
+ queue: false,
+ duration: o.duration,
+ easing: o.options.easing,
+ complete: function() {
+ (o.callback && o.callback.apply(this, arguments));
+ elem.dequeue();
+ }
+ });
+ });
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Fold 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fold = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var size = o.options.size || 15; // Default fold size
+ var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
+ var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var widthFirst = ((mode == 'show') != horizFirst);
+ var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
+ var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
+ var percent = /([0-9]+)%/.exec(size);
+ if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
+ if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
+
+ // Animation
+ var animation1 = {}, animation2 = {};
+ animation1[ref[0]] = mode == 'show' ? distance[0] : size;
+ animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
+
+ // Animate
+ wrapper.animate(animation1, duration, o.options.easing)
+ .animate(animation2, duration, o.options.easing, function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ });
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Highlight 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.highlight = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ props = ['backgroundImage', 'backgroundColor', 'opacity'],
+ mode = $.effects.setMode(elem, o.options.mode || 'show'),
+ animation = {
+ backgroundColor: elem.css('backgroundColor')
+ };
+
+ if (mode == 'hide') {
+ animation.opacity = 0;
+ }
+
+ $.effects.save(elem, props);
+ elem
+ .show()
+ .css({
+ backgroundImage: 'none',
+ backgroundColor: o.options.color || '#ffff99'
+ })
+ .animate(animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.options.easing,
+ complete: function() {
+ (mode == 'hide' && elem.hide());
+ $.effects.restore(elem, props);
+ (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
+ (o.callback && o.callback.apply(this, arguments));
+ elem.dequeue();
+ }
+ });
+ });
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Pulsate 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.pulsate = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ mode = $.effects.setMode(elem, o.options.mode || 'show');
+ times = ((o.options.times || 5) * 2) - 1;
+ duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
+ isVisible = elem.is(':visible'),
+ animateTo = 0;
+
+ if (!isVisible) {
+ elem.css('opacity', 0).show();
+ animateTo = 1;
+ }
+
+ if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
+ times--;
+ }
+
+ for (var i = 0; i < times; i++) {
+ elem.animate({ opacity: animateTo }, duration, o.options.easing);
+ animateTo = (animateTo + 1) % 2;
+ }
+
+ elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
+ if (animateTo == 0) {
+ elem.hide();
+ }
+ (o.callback && o.callback.apply(this, arguments));
+ });
+
+ elem
+ .queue('fx', function() { elem.dequeue(); })
+ .dequeue();
+ });
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Scale 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.puff = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ mode = $.effects.setMode(elem, o.options.mode || 'hide'),
+ percent = parseInt(o.options.percent, 10) || 150,
+ factor = percent / 100,
+ original = { height: elem.height(), width: elem.width() };
+
+ $.extend(o.options, {
+ fade: true,
+ mode: mode,
+ percent: mode == 'hide' ? percent : 100,
+ from: mode == 'hide'
+ ? original
+ : {
+ height: original.height * factor,
+ width: original.width * factor
+ }
+ });
+
+ elem.effect('scale', o.options, o.duration, o.callback);
+ elem.dequeue();
+ });
+};
+
+$.effects.scale = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this);
+
+ // Set options
+ var options = $.extend(true, {}, o.options);
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
+ var direction = o.options.direction || 'both'; // Set default axis
+ var origin = o.options.origin; // The origin of the scaling
+ if (mode != 'effect') { // Set default origin and restore for show/hide
+ options.origin = origin || ['middle','center'];
+ options.restore = true;
+ }
+ var original = {height: el.height(), width: el.width()}; // Save original
+ el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
+
+ // Adjust
+ var factor = { // Set scaling factor
+ y: direction != 'horizontal' ? (percent / 100) : 1,
+ x: direction != 'vertical' ? (percent / 100) : 1
+ };
+ el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
+
+ if (o.options.fade) { // Fade option to support puff
+ if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
+ if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
+ };
+
+ // Animation
+ options.from = el.from; options.to = el.to; options.mode = mode;
+
+ // Animate
+ el.effect('size', options, o.duration, o.callback);
+ el.dequeue();
+ });
+
+};
+
+$.effects.size = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
+ var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
+ var props2 = ['width','height','overflow']; // Copy for children
+ var cProps = ['fontSize'];
+ var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
+ var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var restore = o.options.restore || false; // Default restore
+ var scale = o.options.scale || 'both'; // Default scale mode
+ var origin = o.options.origin; // The origin of the sizing
+ var original = {height: el.height(), width: el.width()}; // Save original
+ el.from = o.options.from || original; // Default from state
+ el.to = o.options.to || original; // Default to state
+ // Adjust
+ if (origin) { // Calculate baseline shifts
+ var baseline = $.effects.getBaseline(origin, original);
+ el.from.top = (original.height - el.from.height) * baseline.y;
+ el.from.left = (original.width - el.from.width) * baseline.x;
+ el.to.top = (original.height - el.to.height) * baseline.y;
+ el.to.left = (original.width - el.to.width) * baseline.x;
+ };
+ var factor = { // Set scaling factor
+ from: {y: el.from.height / original.height, x: el.from.width / original.width},
+ to: {y: el.to.height / original.height, x: el.to.width / original.width}
+ };
+ if (scale == 'box' || scale == 'both') { // Scale the css box
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ props = props.concat(vProps);
+ el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
+ el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
+ };
+ if (factor.from.x != factor.to.x) { // Horizontal props scaling
+ props = props.concat(hProps);
+ el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
+ el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
+ };
+ };
+ if (scale == 'content' || scale == 'both') { // Scale the content
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ props = props.concat(cProps);
+ el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
+ el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
+ };
+ };
+ $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ el.css('overflow','hidden').css(el.from); // Shift
+
+ // Animate
+ if (scale == 'content' || scale == 'both') { // Scale the children
+ vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
+ hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
+ props2 = props.concat(vProps).concat(hProps); // Concat
+ el.find("*[width]").each(function(){
+ child = $(this);
+ if (restore) $.effects.save(child, props2);
+ var c_original = {height: child.height(), width: child.width()}; // Save original
+ child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
+ child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
+ child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
+ };
+ if (factor.from.x != factor.to.x) { // Horizontal props scaling
+ child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
+ child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
+ };
+ child.css(child.from); // Shift children
+ child.animate(child.to, o.duration, o.options.easing, function(){
+ if (restore) $.effects.restore(child, props2); // Restore children
+ }); // Animate children
+ });
+ };
+
+ // Animate
+ el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if (el.to.opacity === 0) {
+ el.css('opacity', el.from.opacity);
+ }
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Shake 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.shake = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default direction
+ var distance = o.options.distance || 20; // Default distance
+ var times = o.options.times || 3; // Default # of times
+ var speed = o.duration || o.options.duration || 140; // Default speed per shake
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+
+ // Animation
+ var animation = {}, animation1 = {}, animation2 = {};
+ animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation1[ref] = (motion == 'pos' ? '+=' : '-=') + distance * 2;
+ animation2[ref] = (motion == 'pos' ? '-=' : '+=') + distance * 2;
+
+ // Animate
+ el.animate(animation, speed, o.options.easing);
+ for (var i = 1; i < times; i++) { // Shakes
+ el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
+ };
+ el.animate(animation1, speed, o.options.easing).
+ animate(animation, speed / 2, o.options.easing, function(){ // Last shake
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ el.queue('fx', function() { el.dequeue(); });
+ el.dequeue();
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Slide 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.slide = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default Direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
+ if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+ // Animate
+ el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
+/*
+ * jQuery UI Effects Transfer 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.transfer = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ target = $(o.options.to),
+ endPosition = target.offset(),
+ animation = {
+ top: endPosition.top,
+ left: endPosition.left,
+ height: target.innerHeight(),
+ width: target.innerWidth()
+ },
+ startPosition = elem.offset(),
+ transfer = $('<div class="ui-effects-transfer"></div>')
+ .appendTo(document.body)
+ .addClass(o.options.className)
+ .css({
+ top: startPosition.top,
+ left: startPosition.left,
+ height: elem.innerHeight(),
+ width: elem.innerWidth(),
+ position: 'absolute'
+ })
+ .animate(animation, o.duration, o.options.easing, function() {
+ transfer.remove();
+ (o.callback && o.callback.apply(elem[0], arguments));
+ elem.dequeue();
+ });
+ });
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Blind 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.blind = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'vertical'; // Default direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var ref = (direction == 'vertical') ? 'height' : 'width';
+ var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
+ if(mode == 'show') wrapper.css(ref, 0); // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref] = mode == 'show' ? distance : 0;
+
+ // Animate
+ wrapper.animate(animation, o.duration, o.options.easing, function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ });
+
+ });
+
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Bounce 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.bounce = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var direction = o.options.direction || 'up'; // Default direction
+ var distance = o.options.distance || 20; // Default distance
+ var times = o.options.times || 5; // Default # of times
+ var speed = o.duration || 250; // Default speed per bounce
+ if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
+ if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+ if (mode == 'hide') distance = distance / (times * 2);
+ if (mode != 'hide') times--;
+
+ // Animate
+ if (mode == 'show') { // Show Bounce
+ var animation = {opacity: 1};
+ animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation, speed / 2, o.options.easing);
+ distance = distance / 2;
+ times--;
+ };
+ for (var i = 0; i < times; i++) { // Bounces
+ var animation1 = {}, animation2 = {};
+ animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
+ distance = (mode == 'hide') ? distance * 2 : distance / 2;
+ };
+ if (mode == 'hide') { // Last Bounce
+ var animation = {opacity: 0};
+ animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ el.animate(animation, speed / 2, o.options.easing, function(){
+ el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ } else {
+ var animation1 = {}, animation2 = {};
+ animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+ el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ };
+ el.queue('fx', function() { el.dequeue(); });
+ el.dequeue();
+ });
+
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Clip 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.clip = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right','height','width'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'vertical'; // Default direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var animate = el[0].tagName == 'IMG' ? wrapper : el;
+ var ref = {
+ size: (direction == 'vertical') ? 'height' : 'width',
+ position: (direction == 'vertical') ? 'top' : 'left'
+ };
+ var distance = (direction == 'vertical') ? animate.height() : animate.width();
+ if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref.size] = mode == 'show' ? distance : 0;
+ animation[ref.position] = mode == 'show' ? 0 : distance / 2;
+
+ // Animate
+ animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+;jQuery.effects || (function($, undefined) {
+
+$.effects = {};
+
+
+
+/******************************************************************************/
+/****************************** COLOR ANIMATIONS ******************************/
+/******************************************************************************/
+
+// override the animation for color styles
+$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
+ 'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
+function(i, attr) {
+ $.fx.step[attr] = function(fx) {
+ if (!fx.colorInit) {
+ fx.start = getColor(fx.elem, attr);
+ fx.end = getRGB(fx.end);
+ fx.colorInit = true;
+ }
+
+ fx.elem.style[attr] = 'rgb(' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
+ Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
+ };
+});
+
+// Color Conversion functions from highlightFade
+// By Blair Mitchelmore
+// http://jquery.offput.ca/highlightFade/
+
+// Parse strings looking for color tuples [255,255,255]
+function getRGB(color) {
+ var result;
+
+ // Check if we're already dealing with an array of colors
+ if ( color && color.constructor == Array && color.length == 3 )
+ return color;
+
+ // Look for rgb(num,num,num)
+ if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
+ return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
+
+ // Look for rgb(num%,num%,num%)
+ if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
+ return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
+
+ // Look for #a0b1c2
+ if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
+ return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+
+ // Look for #fff
+ if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
+ return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+
+ // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+ if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
+ return colors['transparent'];
+
+ // Otherwise, we're most likely dealing with a named color
+ return colors[$.trim(color).toLowerCase()];
+}
+
+function getColor(elem, attr) {
+ var color;
+
+ do {
+ color = $.curCSS(elem, attr);
+
+ // Keep going until we find an element that has color, or we hit the body
+ if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
+ break;
+
+ attr = "backgroundColor";
+ } while ( elem = elem.parentNode );
+
+ return getRGB(color);
+};
+
+// Some named colors to work with
+// From Interface by Stefan Petre
+// http://interface.eyecon.ro/
+
+var colors = {
+ aqua:[0,255,255],
+ azure:[240,255,255],
+ beige:[245,245,220],
+ black:[0,0,0],
+ blue:[0,0,255],
+ brown:[165,42,42],
+ cyan:[0,255,255],
+ darkblue:[0,0,139],
+ darkcyan:[0,139,139],
+ darkgrey:[169,169,169],
+ darkgreen:[0,100,0],
+ darkkhaki:[189,183,107],
+ darkmagenta:[139,0,139],
+ darkolivegreen:[85,107,47],
+ darkorange:[255,140,0],
+ darkorchid:[153,50,204],
+ darkred:[139,0,0],
+ darksalmon:[233,150,122],
+ darkviolet:[148,0,211],
+ fuchsia:[255,0,255],
+ gold:[255,215,0],
+ green:[0,128,0],
+ indigo:[75,0,130],
+ khaki:[240,230,140],
+ lightblue:[173,216,230],
+ lightcyan:[224,255,255],
+ lightgreen:[144,238,144],
+ lightgrey:[211,211,211],
+ lightpink:[255,182,193],
+ lightyellow:[255,255,224],
+ lime:[0,255,0],
+ magenta:[255,0,255],
+ maroon:[128,0,0],
+ navy:[0,0,128],
+ olive:[128,128,0],
+ orange:[255,165,0],
+ pink:[255,192,203],
+ purple:[128,0,128],
+ violet:[128,0,128],
+ red:[255,0,0],
+ silver:[192,192,192],
+ white:[255,255,255],
+ yellow:[255,255,0],
+ transparent: [255,255,255]
+};
+
+
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+
+var classAnimationActions = ['add', 'remove', 'toggle'],
+ shorthandStyles = {
+ border: 1,
+ borderBottom: 1,
+ borderColor: 1,
+ borderLeft: 1,
+ borderRight: 1,
+ borderTop: 1,
+ borderWidth: 1,
+ margin: 1,
+ padding: 1
+ };
+
+function getElementStyles() {
+ var style = document.defaultView
+ ? document.defaultView.getComputedStyle(this, null)
+ : this.currentStyle,
+ newStyle = {},
+ key,
+ camelCase;
+
+ // webkit enumerates style porperties
+ if (style && style.length && style[0] && style[style[0]]) {
+ var len = style.length;
+ while (len--) {
+ key = style[len];
+ if (typeof style[key] == 'string') {
+ camelCase = key.replace(/\-(\w)/g, function(all, letter){
+ return letter.toUpperCase();
+ });
+ newStyle[camelCase] = style[key];
+ }
+ }
+ } else {
+ for (key in style) {
+ if (typeof style[key] === 'string') {
+ newStyle[key] = style[key];
+ }
+ }
+ }
+
+ return newStyle;
+}
+
+function filterStyles(styles) {
+ var name, value;
+ for (name in styles) {
+ value = styles[name];
+ if (
+ // ignore null and undefined values
+ value == null ||
+ // ignore functions (when does this occur?)
+ $.isFunction(value) ||
+ // shorthand styles that need to be expanded
+ name in shorthandStyles ||
+ // ignore scrollbars (break in IE)
+ (/scrollbar/).test(name) ||
+
+ // only colors or values that can be converted to numbers
+ (!(/color/i).test(name) && isNaN(parseFloat(value)))
+ ) {
+ delete styles[name];
+ }
+ }
+
+ return styles;
+}
+
+function styleDifference(oldStyle, newStyle) {
+ var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
+ name;
+
+ for (name in newStyle) {
+ if (oldStyle[name] != newStyle[name]) {
+ diff[name] = newStyle[name];
+ }
+ }
+
+ return diff;
+}
+
+$.effects.animateClass = function(value, duration, easing, callback) {
+ if ($.isFunction(easing)) {
+ callback = easing;
+ easing = null;
+ }
+
+ return this.queue('fx', function() {
+ var that = $(this),
+ originalStyleAttr = that.attr('style') || ' ',
+ originalStyle = filterStyles(getElementStyles.call(this)),
+ newStyle,
+ className = that.attr('className');
+
+ $.each(classAnimationActions, function(i, action) {
+ if (value[action]) {
+ that[action + 'Class'](value[action]);
+ }
+ });
+ newStyle = filterStyles(getElementStyles.call(this));
+ that.attr('className', className);
+
+ that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() {
+ $.each(classAnimationActions, function(i, action) {
+ if (value[action]) { that[action + 'Class'](value[action]); }
+ });
+ // work around bug in IE by clearing the cssText before setting it
+ if (typeof that.attr('style') == 'object') {
+ that.attr('style').cssText = '';
+ that.attr('style').cssText = originalStyleAttr;
+ } else {
+ that.attr('style', originalStyleAttr);
+ }
+ if (callback) { callback.apply(this, arguments); }
+ });
+
+ // $.animate adds a function to the end of the queue
+ // but we want it at the front
+ var queue = $.queue(this),
+ anim = queue.splice(queue.length - 1, 1)[0];
+ queue.splice(1, 0, anim);
+ $.dequeue(this);
+ });
+};
+
+$.fn.extend({
+ _addClass: $.fn.addClass,
+ addClass: function(classNames, speed, easing, callback) {
+ return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
+ },
+
+ _removeClass: $.fn.removeClass,
+ removeClass: function(classNames,speed,easing,callback) {
+ return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
+ },
+
+ _toggleClass: $.fn.toggleClass,
+ toggleClass: function(classNames, force, speed, easing, callback) {
+ if ( typeof force == "boolean" || force === undefined ) {
+ if ( !speed ) {
+ // without speed parameter;
+ return this._toggleClass(classNames, force);
+ } else {
+ return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
+ }
+ } else {
+ // without switch parameter;
+ return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
+ }
+ },
+
+ switchClass: function(remove,add,speed,easing,callback) {
+ return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
+ }
+});
+
+
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+$.extend($.effects, {
+ version: "1.8.10",
+
+ // Saves a set of properties in a data storage
+ save: function(element, set) {
+ for(var i=0; i < set.length; i++) {
+ if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
+ }
+ },
+
+ // Restores a set of previously saved properties from a data storage
+ restore: function(element, set) {
+ for(var i=0; i < set.length; i++) {
+ if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
+ }
+ },
+
+ setMode: function(el, mode) {
+ if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
+ return mode;
+ },
+
+ getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
+ // this should be a little more flexible in the future to handle a string & hash
+ var y, x;
+ switch (origin[0]) {
+ case 'top': y = 0; break;
+ case 'middle': y = 0.5; break;
+ case 'bottom': y = 1; break;
+ default: y = origin[0] / original.height;
+ };
+ switch (origin[1]) {
+ case 'left': x = 0; break;
+ case 'center': x = 0.5; break;
+ case 'right': x = 1; break;
+ default: x = origin[1] / original.width;
+ };
+ return {x: x, y: y};
+ },
+
+ // Wraps the element around a wrapper that copies position properties
+ createWrapper: function(element) {
+
+ // if the element is already wrapped, return it
+ if (element.parent().is('.ui-effects-wrapper')) {
+ return element.parent();
+ }
+
+ // wrap the element
+ var props = {
+ width: element.outerWidth(true),
+ height: element.outerHeight(true),
+ 'float': element.css('float')
+ },
+ wrapper = $('<div></div>')
+ .addClass('ui-effects-wrapper')
+ .css({
+ fontSize: '100%',
+ background: 'transparent',
+ border: 'none',
+ margin: 0,
+ padding: 0
+ });
+
+ element.wrap(wrapper);
+ wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
+
+ // transfer positioning properties to the wrapper
+ if (element.css('position') == 'static') {
+ wrapper.css({ position: 'relative' });
+ element.css({ position: 'relative' });
+ } else {
+ $.extend(props, {
+ position: element.css('position'),
+ zIndex: element.css('z-index')
+ });
+ $.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
+ props[pos] = element.css(pos);
+ if (isNaN(parseInt(props[pos], 10))) {
+ props[pos] = 'auto';
+ }
+ });
+ element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
+ }
+
+ return wrapper.css(props).show();
+ },
+
+ removeWrapper: function(element) {
+ if (element.parent().is('.ui-effects-wrapper'))
+ return element.parent().replaceWith(element);
+ return element;
+ },
+
+ setTransition: function(element, list, factor, value) {
+ value = value || {};
+ $.each(list, function(i, x){
+ unit = element.cssUnit(x);
+ if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
+ });
+ return value;
+ }
+});
+
+
+function _normalizeArguments(effect, options, speed, callback) {
+ // shift params for method overloading
+ if (typeof effect == 'object') {
+ callback = options;
+ speed = null;
+ options = effect;
+ effect = options.effect;
+ }
+ if ($.isFunction(options)) {
+ callback = options;
+ speed = null;
+ options = {};
+ }
+ if (typeof options == 'number' || $.fx.speeds[options]) {
+ callback = speed;
+ speed = options;
+ options = {};
+ }
+ if ($.isFunction(speed)) {
+ callback = speed;
+ speed = null;
+ }
+
+ options = options || {};
+
+ speed = speed || options.duration;
+ speed = $.fx.off ? 0 : typeof speed == 'number'
+ ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
+
+ callback = callback || options.complete;
+
+ return [effect, options, speed, callback];
+}
+
+function standardSpeed( speed ) {
+ // valid standard speeds
+ if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
+ return true;
+ }
+
+ // invalid strings - treat as "normal" speed
+ if ( typeof speed === "string" && !$.effects[ speed ] ) {
+ return true;
+ }
+
+ return false;
+}
+
+$.fn.extend({
+ effect: function(effect, options, speed, callback) {
+ var args = _normalizeArguments.apply(this, arguments),
+ // TODO: make effects take actual parameters instead of a hash
+ args2 = {
+ options: args[1],
+ duration: args[2],
+ callback: args[3]
+ },
+ mode = args2.options.mode,
+ effectMethod = $.effects[effect];
+
+ if ( $.fx.off || !effectMethod ) {
+ // delegate to the original method (e.g., .show()) if possible
+ if ( mode ) {
+ return this[ mode ]( args2.duration, args2.callback );
+ } else {
+ return this.each(function() {
+ if ( args2.callback ) {
+ args2.callback.call( this );
+ }
+ });
+ }
+ }
+
+ return effectMethod.call(this, args2);
+ },
+
+ _show: $.fn.show,
+ show: function(speed) {
+ if ( standardSpeed( speed ) ) {
+ return this._show.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'show';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ _hide: $.fn.hide,
+ hide: function(speed) {
+ if ( standardSpeed( speed ) ) {
+ return this._hide.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'hide';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ // jQuery core overloads toggle and creates _toggle
+ __toggle: $.fn.toggle,
+ toggle: function(speed) {
+ if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
+ return this.__toggle.apply(this, arguments);
+ } else {
+ var args = _normalizeArguments.apply(this, arguments);
+ args[1].mode = 'toggle';
+ return this.effect.apply(this, args);
+ }
+ },
+
+ // helper functions
+ cssUnit: function(key) {
+ var style = this.css(key), val = [];
+ $.each( ['em','px','%','pt'], function(i, unit){
+ if(style.indexOf(unit) > 0)
+ val = [parseFloat(style), unit];
+ });
+ return val;
+ }
+});
+
+
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2008 George McGinley Smith
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+$.easing.jswing = $.easing.swing;
+
+$.extend($.easing,
+{
+ def: 'easeOutQuad',
+ swing: function (x, t, b, c, d) {
+ //alert($.easing.default);
+ return $.easing[$.easing.def](x, t, b, c, d);
+ },
+ easeInQuad: function (x, t, b, c, d) {
+ return c*(t/=d)*t + b;
+ },
+ easeOutQuad: function (x, t, b, c, d) {
+ return -c *(t/=d)*(t-2) + b;
+ },
+ easeInOutQuad: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t + b;
+ return -c/2 * ((--t)*(t-2) - 1) + b;
+ },
+ easeInCubic: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t + b;
+ },
+ easeOutCubic: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t + 1) + b;
+ },
+ easeInOutCubic: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t + b;
+ return c/2*((t-=2)*t*t + 2) + b;
+ },
+ easeInQuart: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t + b;
+ },
+ easeOutQuart: function (x, t, b, c, d) {
+ return -c * ((t=t/d-1)*t*t*t - 1) + b;
+ },
+ easeInOutQuart: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+ return -c/2 * ((t-=2)*t*t*t - 2) + b;
+ },
+ easeInQuint: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t*t + b;
+ },
+ easeOutQuint: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t*t*t + 1) + b;
+ },
+ easeInOutQuint: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+ return c/2*((t-=2)*t*t*t*t + 2) + b;
+ },
+ easeInSine: function (x, t, b, c, d) {
+ return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+ },
+ easeOutSine: function (x, t, b, c, d) {
+ return c * Math.sin(t/d * (Math.PI/2)) + b;
+ },
+ easeInOutSine: function (x, t, b, c, d) {
+ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+ },
+ easeInExpo: function (x, t, b, c, d) {
+ return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+ },
+ easeOutExpo: function (x, t, b, c, d) {
+ return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+ },
+ easeInOutExpo: function (x, t, b, c, d) {
+ if (t==0) return b;
+ if (t==d) return b+c;
+ if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+ return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+ },
+ easeInCirc: function (x, t, b, c, d) {
+ return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+ },
+ easeOutCirc: function (x, t, b, c, d) {
+ return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+ },
+ easeInOutCirc: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+ return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+ },
+ easeInElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ },
+ easeOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+ },
+ easeInOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+ },
+ easeInBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*(t/=d)*t*((s+1)*t - s) + b;
+ },
+ easeOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+ },
+ easeInOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+ return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+ },
+ easeInBounce: function (x, t, b, c, d) {
+ return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+ },
+ easeOutBounce: function (x, t, b, c, d) {
+ if ((t/=d) < (1/2.75)) {
+ return c*(7.5625*t*t) + b;
+ } else if (t < (2/2.75)) {
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+ } else if (t < (2.5/2.75)) {
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+ } else {
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+ }
+ },
+ easeInOutBounce: function (x, t, b, c, d) {
+ if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+ return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+ }
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2001 Robert Penner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Drop 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.drop = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right','opacity'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default Direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
+ if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+
+ // Animation
+ var animation = {opacity: mode == 'show' ? 1 : 0};
+ animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+ // Animate
+ el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Explode 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.explode = function(o) {
+
+ return this.queue(function() {
+
+ var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+ var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+
+ o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
+ var el = $(this).show().css('visibility', 'hidden');
+ var offset = el.offset();
+
+ //Substract the margins - not fixing the problem yet.
+ offset.top -= parseInt(el.css("marginTop"),10) || 0;
+ offset.left -= parseInt(el.css("marginLeft"),10) || 0;
+
+ var width = el.outerWidth(true);
+ var height = el.outerHeight(true);
+
+ for(var i=0;i<rows;i++) { // =
+ for(var j=0;j<cells;j++) { // ||
+ el
+ .clone()
+ .appendTo('body')
+ .wrap('<div></div>')
+ .css({
+ position: 'absolute',
+ visibility: 'visible',
+ left: -j*(width/cells),
+ top: -i*(height/rows)
+ })
+ .parent()
+ .addClass('ui-effects-explode')
+ .css({
+ position: 'absolute',
+ overflow: 'hidden',
+ width: width/cells,
+ height: height/rows,
+ left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
+ top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
+ opacity: o.options.mode == 'show' ? 0 : 1
+ }).animate({
+ left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
+ top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
+ opacity: o.options.mode == 'show' ? 1 : 0
+ }, o.duration || 500);
+ }
+ }
+
+ // Set a timeout, to call the callback approx. when the other animations have finished
+ setTimeout(function() {
+
+ o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
+ if(o.callback) o.callback.apply(el[0]); // Callback
+ el.dequeue();
+
+ $('div.ui-effects-explode').remove();
+
+ }, o.duration || 500);
+
+
+ });
+
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Fade 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fade = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ mode = $.effects.setMode(elem, o.options.mode || 'hide');
+
+ elem.animate({ opacity: mode }, {
+ queue: false,
+ duration: o.duration,
+ easing: o.options.easing,
+ complete: function() {
+ (o.callback && o.callback.apply(this, arguments));
+ elem.dequeue();
+ }
+ });
+ });
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Fold 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fold = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+ var size = o.options.size || 15; // Default fold size
+ var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
+ var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var widthFirst = ((mode == 'show') != horizFirst);
+ var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
+ var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
+ var percent = /([0-9]+)%/.exec(size);
+ if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
+ if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
+
+ // Animation
+ var animation1 = {}, animation2 = {};
+ animation1[ref[0]] = mode == 'show' ? distance[0] : size;
+ animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
+
+ // Animate
+ wrapper.animate(animation1, duration, o.options.easing)
+ .animate(animation2, duration, o.options.easing, function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(el[0], arguments); // Callback
+ el.dequeue();
+ });
+
+ });
+
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Highlight 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.highlight = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ props = ['backgroundImage', 'backgroundColor', 'opacity'],
+ mode = $.effects.setMode(elem, o.options.mode || 'show'),
+ animation = {
+ backgroundColor: elem.css('backgroundColor')
+ };
+
+ if (mode == 'hide') {
+ animation.opacity = 0;
+ }
+
+ $.effects.save(elem, props);
+ elem
+ .show()
+ .css({
+ backgroundImage: 'none',
+ backgroundColor: o.options.color || '#ffff99'
+ })
+ .animate(animation, {
+ queue: false,
+ duration: o.duration,
+ easing: o.options.easing,
+ complete: function() {
+ (mode == 'hide' && elem.hide());
+ $.effects.restore(elem, props);
+ (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
+ (o.callback && o.callback.apply(this, arguments));
+ elem.dequeue();
+ }
+ });
+ });
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Pulsate 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.pulsate = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ mode = $.effects.setMode(elem, o.options.mode || 'show');
+ times = ((o.options.times || 5) * 2) - 1;
+ duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
+ isVisible = elem.is(':visible'),
+ animateTo = 0;
+
+ if (!isVisible) {
+ elem.css('opacity', 0).show();
+ animateTo = 1;
+ }
+
+ if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
+ times--;
+ }
+
+ for (var i = 0; i < times; i++) {
+ elem.animate({ opacity: animateTo }, duration, o.options.easing);
+ animateTo = (animateTo + 1) % 2;
+ }
+
+ elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
+ if (animateTo == 0) {
+ elem.hide();
+ }
+ (o.callback && o.callback.apply(this, arguments));
+ });
+
+ elem
+ .queue('fx', function() { elem.dequeue(); })
+ .dequeue();
+ });
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Scale 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.puff = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ mode = $.effects.setMode(elem, o.options.mode || 'hide'),
+ percent = parseInt(o.options.percent, 10) || 150,
+ factor = percent / 100,
+ original = { height: elem.height(), width: elem.width() };
+
+ $.extend(o.options, {
+ fade: true,
+ mode: mode,
+ percent: mode == 'hide' ? percent : 100,
+ from: mode == 'hide'
+ ? original
+ : {
+ height: original.height * factor,
+ width: original.width * factor
+ }
+ });
+
+ elem.effect('scale', o.options, o.duration, o.callback);
+ elem.dequeue();
+ });
+};
+
+$.effects.scale = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this);
+
+ // Set options
+ var options = $.extend(true, {}, o.options);
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
+ var direction = o.options.direction || 'both'; // Set default axis
+ var origin = o.options.origin; // The origin of the scaling
+ if (mode != 'effect') { // Set default origin and restore for show/hide
+ options.origin = origin || ['middle','center'];
+ options.restore = true;
+ }
+ var original = {height: el.height(), width: el.width()}; // Save original
+ el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
+
+ // Adjust
+ var factor = { // Set scaling factor
+ y: direction != 'horizontal' ? (percent / 100) : 1,
+ x: direction != 'vertical' ? (percent / 100) : 1
+ };
+ el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
+
+ if (o.options.fade) { // Fade option to support puff
+ if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
+ if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
+ };
+
+ // Animation
+ options.from = el.from; options.to = el.to; options.mode = mode;
+
+ // Animate
+ el.effect('size', options, o.duration, o.callback);
+ el.dequeue();
+ });
+
+};
+
+$.effects.size = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
+ var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
+ var props2 = ['width','height','overflow']; // Copy for children
+ var cProps = ['fontSize'];
+ var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
+ var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var restore = o.options.restore || false; // Default restore
+ var scale = o.options.scale || 'both'; // Default scale mode
+ var origin = o.options.origin; // The origin of the sizing
+ var original = {height: el.height(), width: el.width()}; // Save original
+ el.from = o.options.from || original; // Default from state
+ el.to = o.options.to || original; // Default to state
+ // Adjust
+ if (origin) { // Calculate baseline shifts
+ var baseline = $.effects.getBaseline(origin, original);
+ el.from.top = (original.height - el.from.height) * baseline.y;
+ el.from.left = (original.width - el.from.width) * baseline.x;
+ el.to.top = (original.height - el.to.height) * baseline.y;
+ el.to.left = (original.width - el.to.width) * baseline.x;
+ };
+ var factor = { // Set scaling factor
+ from: {y: el.from.height / original.height, x: el.from.width / original.width},
+ to: {y: el.to.height / original.height, x: el.to.width / original.width}
+ };
+ if (scale == 'box' || scale == 'both') { // Scale the css box
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ props = props.concat(vProps);
+ el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
+ el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
+ };
+ if (factor.from.x != factor.to.x) { // Horizontal props scaling
+ props = props.concat(hProps);
+ el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
+ el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
+ };
+ };
+ if (scale == 'content' || scale == 'both') { // Scale the content
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ props = props.concat(cProps);
+ el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
+ el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
+ };
+ };
+ $.effects.save(el, restore ? props : props1); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ el.css('overflow','hidden').css(el.from); // Shift
+
+ // Animate
+ if (scale == 'content' || scale == 'both') { // Scale the children
+ vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
+ hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
+ props2 = props.concat(vProps).concat(hProps); // Concat
+ el.find("*[width]").each(function(){
+ child = $(this);
+ if (restore) $.effects.save(child, props2);
+ var c_original = {height: child.height(), width: child.width()}; // Save original
+ child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
+ child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
+ if (factor.from.y != factor.to.y) { // Vertical props scaling
+ child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
+ child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
+ };
+ if (factor.from.x != factor.to.x) { // Horizontal props scaling
+ child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
+ child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
+ };
+ child.css(child.from); // Shift children
+ child.animate(child.to, o.duration, o.options.easing, function(){
+ if (restore) $.effects.restore(child, props2); // Restore children
+ }); // Animate children
+ });
+ };
+
+ // Animate
+ el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if (el.to.opacity === 0) {
+ el.css('opacity', el.from.opacity);
+ }
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Shake 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.shake = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default direction
+ var distance = o.options.distance || 20; // Default distance
+ var times = o.options.times || 3; // Default # of times
+ var speed = o.duration || o.options.duration || 140; // Default speed per shake
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+
+ // Animation
+ var animation = {}, animation1 = {}, animation2 = {};
+ animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+ animation1[ref] = (motion == 'pos' ? '+=' : '-=') + distance * 2;
+ animation2[ref] = (motion == 'pos' ? '-=' : '+=') + distance * 2;
+
+ // Animate
+ el.animate(animation, speed, o.options.easing);
+ for (var i = 1; i < times; i++) { // Shakes
+ el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
+ };
+ el.animate(animation1, speed, o.options.easing).
+ animate(animation, speed / 2, o.options.easing, function(){ // Last shake
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ });
+ el.queue('fx', function() { el.dequeue(); });
+ el.dequeue();
+ });
+
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Slide 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.slide = function(o) {
+
+ return this.queue(function() {
+
+ // Create element
+ var el = $(this), props = ['position','top','bottom','left','right'];
+
+ // Set options
+ var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
+ var direction = o.options.direction || 'left'; // Default Direction
+
+ // Adjust
+ $.effects.save(el, props); el.show(); // Save & Show
+ $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+ var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+ var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+ var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
+ if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
+
+ // Animation
+ var animation = {};
+ animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+ // Animate
+ el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+ if(mode == 'hide') el.hide(); // Hide
+ $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+ if(o.callback) o.callback.apply(this, arguments); // Callback
+ el.dequeue();
+ }});
+
+ });
+
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Effects Transfer 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ * jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.transfer = function(o) {
+ return this.queue(function() {
+ var elem = $(this),
+ target = $(o.options.to),
+ endPosition = target.offset(),
+ animation = {
+ top: endPosition.top,
+ left: endPosition.left,
+ height: target.innerHeight(),
+ width: target.innerWidth()
+ },
+ startPosition = elem.offset(),
+ transfer = $('<div class="ui-effects-transfer"></div>')
+ .appendTo(document.body)
+ .addClass(o.options.className)
+ .css({
+ top: startPosition.top,
+ left: startPosition.left,
+ height: elem.innerHeight(),
+ width: elem.innerWidth(),
+ position: 'absolute'
+ })
+ .animate(animation, o.duration, o.options.easing, function() {
+ transfer.remove();
+ (o.callback && o.callback.apply(elem[0], arguments));
+ elem.dequeue();
+ });
+ });
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Accordion 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.accordion", {
+ options: {
+ active: 0,
+ animated: "slide",
+ autoHeight: true,
+ clearStyle: false,
+ collapsible: false,
+ event: "click",
+ fillSpace: false,
+ header: "> li > :first-child,> :not(li):even",
+ icons: {
+ header: "ui-icon-triangle-1-e",
+ headerSelected: "ui-icon-triangle-1-s"
+ },
+ navigation: false,
+ navigationFilter: function() {
+ return this.href.toLowerCase() === location.href.toLowerCase();
+ }
+ },
+
+ _create: function() {
+ var self = this,
+ options = self.options;
+
+ self.running = 0;
+
+ self.element
+ .addClass( "ui-accordion ui-widget ui-helper-reset" )
+ // in lack of child-selectors in CSS
+ // we need to mark top-LIs in a UL-accordion for some IE-fix
+ .children( "li" )
+ .addClass( "ui-accordion-li-fix" );
+
+ self.headers = self.element.find( options.header )
+ .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
+ .bind( "mouseenter.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).addClass( "ui-state-hover" );
+ })
+ .bind( "mouseleave.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( "ui-state-hover" );
+ })
+ .bind( "focus.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).addClass( "ui-state-focus" );
+ })
+ .bind( "blur.accordion", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( "ui-state-focus" );
+ });
+
+ self.headers.next()
+ .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
+
+ if ( options.navigation ) {
+ var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
+ if ( current.length ) {
+ var header = current.closest( ".ui-accordion-header" );
+ if ( header.length ) {
+ // anchor within header
+ self.active = header;
+ } else {
+ // anchor within content
+ self.active = current.closest( ".ui-accordion-content" ).prev();
+ }
+ }
+ }
+
+ self.active = self._findActive( self.active || options.active )
+ .addClass( "ui-state-default ui-state-active" )
+ .toggleClass( "ui-corner-all" )
+ .toggleClass( "ui-corner-top" );
+ self.active.next().addClass( "ui-accordion-content-active" );
+
+ self._createIcons();
+ self.resize();
+
+ // ARIA
+ self.element.attr( "role", "tablist" );
+
+ self.headers
+ .attr( "role", "tab" )
+ .bind( "keydown.accordion", function( event ) {
+ return self._keydown( event );
+ })
+ .next()
+ .attr( "role", "tabpanel" );
+
+ self.headers
+ .not( self.active || "" )
+ .attr({
+ "aria-expanded": "false",
+ tabIndex: -1
+ })
+ .next()
+ .hide();
+
+ // make sure at least one header is in the tab order
+ if ( !self.active.length ) {
+ self.headers.eq( 0 ).attr( "tabIndex", 0 );
+ } else {
+ self.active
+ .attr({
+ "aria-expanded": "true",
+ tabIndex: 0
+ });
+ }
+
+ // only need links in tab order for Safari
+ if ( !$.browser.safari ) {
+ self.headers.find( "a" ).attr( "tabIndex", -1 );
+ }
+
+ if ( options.event ) {
+ self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
+ self._clickHandler.call( self, event, this );
+ event.preventDefault();
+ });
+ }
+ },
+
+ _createIcons: function() {
+ var options = this.options;
+ if ( options.icons ) {
+ $( "<span></span>" )
+ .addClass( "ui-icon " + options.icons.header )
+ .prependTo( this.headers );
+ this.active.children( ".ui-icon" )
+ .toggleClass(options.icons.header)
+ .toggleClass(options.icons.headerSelected);
+ this.element.addClass( "ui-accordion-icons" );
+ }
+ },
+
+ _destroyIcons: function() {
+ this.headers.children( ".ui-icon" ).remove();
+ this.element.removeClass( "ui-accordion-icons" );
+ },
+
+ destroy: function() {
+ var options = this.options;
+
+ this.element
+ .removeClass( "ui-accordion ui-widget ui-helper-reset" )
+ .removeAttr( "role" );
+
+ this.headers
+ .unbind( ".accordion" )
+ .removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-expanded" )
+ .removeAttr( "tabIndex" );
+
+ this.headers.find( "a" ).removeAttr( "tabIndex" );
+ this._destroyIcons();
+ var contents = this.headers.next()
+ .css( "display", "" )
+ .removeAttr( "role" )
+ .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
+ if ( options.autoHeight || options.fillHeight ) {
+ contents.css( "height", "" );
+ }
+
+ return $.Widget.prototype.destroy.call( this );
+ },
+
+ _setOption: function( key, value ) {
+ $.Widget.prototype._setOption.apply( this, arguments );
+
+ if ( key == "active" ) {
+ this.activate( value );
+ }
+ if ( key == "icons" ) {
+ this._destroyIcons();
+ if ( value ) {
+ this._createIcons();
+ }
+ }
+ // #5332 - opacity doesn't cascade to positioned elements in IE
+ // so we need to add the disabled class to the headers and panels
+ if ( key == "disabled" ) {
+ this.headers.add(this.headers.next())
+ [ value ? "addClass" : "removeClass" ](
+ "ui-accordion-disabled ui-state-disabled" );
+ }
+ },
+
+ _keydown: function( event ) {
+ if ( this.options.disabled || event.altKey || event.ctrlKey ) {
+ return;
+ }
+
+ var keyCode = $.ui.keyCode,
+ length = this.headers.length,
+ currentIndex = this.headers.index( event.target ),
+ toFocus = false;
+
+ switch ( event.keyCode ) {
+ case keyCode.RIGHT:
+ case keyCode.DOWN:
+ toFocus = this.headers[ ( currentIndex + 1 ) % length ];
+ break;
+ case keyCode.LEFT:
+ case keyCode.UP:
+ toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
+ break;
+ case keyCode.SPACE:
+ case keyCode.ENTER:
+ this._clickHandler( { target: event.target }, event.target );
+ event.preventDefault();
+ }
+
+ if ( toFocus ) {
+ $( event.target ).attr( "tabIndex", -1 );
+ $( toFocus ).attr( "tabIndex", 0 );
+ toFocus.focus();
+ return false;
+ }
+
+ return true;
+ },
+
+ resize: function() {
+ var options = this.options,
+ maxHeight;
+
+ if ( options.fillSpace ) {
+ if ( $.browser.msie ) {
+ var defOverflow = this.element.parent().css( "overflow" );
+ this.element.parent().css( "overflow", "hidden");
+ }
+ maxHeight = this.element.parent().height();
+ if ($.browser.msie) {
+ this.element.parent().css( "overflow", defOverflow );
+ }
+
+ this.headers.each(function() {
+ maxHeight -= $( this ).outerHeight( true );
+ });
+
+ this.headers.next()
+ .each(function() {
+ $( this ).height( Math.max( 0, maxHeight -
+ $( this ).innerHeight() + $( this ).height() ) );
+ })
+ .css( "overflow", "auto" );
+ } else if ( options.autoHeight ) {
+ maxHeight = 0;
+ this.headers.next()
+ .each(function() {
+ maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+ })
+ .height( maxHeight );
+ }
+
+ return this;
+ },
+
+ activate: function( index ) {
+ // TODO this gets called on init, changing the option without an explicit call for that
+ this.options.active = index;
+ // call clickHandler with custom event
+ var active = this._findActive( index )[ 0 ];
+ this._clickHandler( { target: active }, active );
+
+ return this;
+ },
+
+ _findActive: function( selector ) {
+ return selector
+ ? typeof selector === "number"
+ ? this.headers.filter( ":eq(" + selector + ")" )
+ : this.headers.not( this.headers.not( selector ) )
+ : selector === false
+ ? $( [] )
+ : this.headers.filter( ":eq(0)" );
+ },
+
+ // TODO isn't event.target enough? why the separate target argument?
+ _clickHandler: function( event, target ) {
+ var options = this.options;
+ if ( options.disabled ) {
+ return;
+ }
+
+ // called only when using activate(false) to close all parts programmatically
+ if ( !event.target ) {
+ if ( !options.collapsible ) {
+ return;
+ }
+ this.active
+ .removeClass( "ui-state-active ui-corner-top" )
+ .addClass( "ui-state-default ui-corner-all" )
+ .children( ".ui-icon" )
+ .removeClass( options.icons.headerSelected )
+ .addClass( options.icons.header );
+ this.active.next().addClass( "ui-accordion-content-active" );
+ var toHide = this.active.next(),
+ data = {
+ options: options,
+ newHeader: $( [] ),
+ oldHeader: options.active,
+ newContent: $( [] ),
+ oldContent: toHide
+ },
+ toShow = ( this.active = $( [] ) );
+ this._toggle( toShow, toHide, data );
+ return;
+ }
+
+ // get the click target
+ var clicked = $( event.currentTarget || target ),
+ clickedIsActive = clicked[0] === this.active[0];
+
+ // TODO the option is changed, is that correct?
+ // TODO if it is correct, shouldn't that happen after determining that the click is valid?
+ options.active = options.collapsible && clickedIsActive ?
+ false :
+ this.headers.index( clicked );
+
+ // if animations are still active, or the active header is the target, ignore click
+ if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
+ return;
+ }
+
+ // find elements to show and hide
+ var active = this.active,
+ toShow = clicked.next(),
+ toHide = this.active.next(),
+ data = {
+ options: options,
+ newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
+ oldHeader: this.active,
+ newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
+ oldContent: toHide
+ },
+ down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
+
+ // when the call to ._toggle() comes after the class changes
+ // it causes a very odd bug in IE 8 (see #6720)
+ this.active = clickedIsActive ? $([]) : clicked;
+ this._toggle( toShow, toHide, data, clickedIsActive, down );
+
+ // switch classes
+ active
+ .removeClass( "ui-state-active ui-corner-top" )
+ .addClass( "ui-state-default ui-corner-all" )
+ .children( ".ui-icon" )
+ .removeClass( options.icons.headerSelected )
+ .addClass( options.icons.header );
+ if ( !clickedIsActive ) {
+ clicked
+ .removeClass( "ui-state-default ui-corner-all" )
+ .addClass( "ui-state-active ui-corner-top" )
+ .children( ".ui-icon" )
+ .removeClass( options.icons.header )
+ .addClass( options.icons.headerSelected );
+ clicked
+ .next()
+ .addClass( "ui-accordion-content-active" );
+ }
+
+ return;
+ },
+
+ _toggle: function( toShow, toHide, data, clickedIsActive, down ) {
+ var self = this,
+ options = self.options;
+
+ self.toShow = toShow;
+ self.toHide = toHide;
+ self.data = data;
+
+ var complete = function() {
+ if ( !self ) {
+ return;
+ }
+ return self._completed.apply( self, arguments );
+ };
+
+ // trigger changestart event
+ self._trigger( "changestart", null, self.data );
+
+ // count elements to animate
+ self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
+
+ if ( options.animated ) {
+ var animOptions = {};
+
+ if ( options.collapsible && clickedIsActive ) {
+ animOptions = {
+ toShow: $( [] ),
+ toHide: toHide,
+ complete: complete,
+ down: down,
+ autoHeight: options.autoHeight || options.fillSpace
+ };
+ } else {
+ animOptions = {
+ toShow: toShow,
+ toHide: toHide,
+ complete: complete,
+ down: down,
+ autoHeight: options.autoHeight || options.fillSpace
+ };
+ }
+
+ if ( !options.proxied ) {
+ options.proxied = options.animated;
+ }
+
+ if ( !options.proxiedDuration ) {
+ options.proxiedDuration = options.duration;
+ }
+
+ options.animated = $.isFunction( options.proxied ) ?
+ options.proxied( animOptions ) :
+ options.proxied;
+
+ options.duration = $.isFunction( options.proxiedDuration ) ?
+ options.proxiedDuration( animOptions ) :
+ options.proxiedDuration;
+
+ var animations = $.ui.accordion.animations,
+ duration = options.duration,
+ easing = options.animated;
+
+ if ( easing && !animations[ easing ] && !$.easing[ easing ] ) {
+ easing = "slide";
+ }
+ if ( !animations[ easing ] ) {
+ animations[ easing ] = function( options ) {
+ this.slide( options, {
+ easing: easing,
+ duration: duration || 700
+ });
+ };
+ }
+
+ animations[ easing ]( animOptions );
+ } else {
+ if ( options.collapsible && clickedIsActive ) {
+ toShow.toggle();
+ } else {
+ toHide.hide();
+ toShow.show();
+ }
+
+ complete( true );
+ }
+
+ // TODO assert that the blur and focus triggers are really necessary, remove otherwise
+ toHide.prev()
+ .attr({
+ "aria-expanded": "false",
+ tabIndex: -1
+ })
+ .blur();
+ toShow.prev()
+ .attr({
+ "aria-expanded": "true",
+ tabIndex: 0
+ })
+ .focus();
+ },
+
+ _completed: function( cancel ) {
+ this.running = cancel ? 0 : --this.running;
+ if ( this.running ) {
+ return;
+ }
+
+ if ( this.options.clearStyle ) {
+ this.toShow.add( this.toHide ).css({
+ height: "",
+ overflow: ""
+ });
+ }
+
+ // other classes are removed before the animation; this one needs to stay until completed
+ this.toHide.removeClass( "ui-accordion-content-active" );
+ // Work around for rendering bug in IE (#5421)
+ if ( this.toHide.length ) {
+ this.toHide.parent()[0].className = this.toHide.parent()[0].className;
+ }
+
+ this._trigger( "change", null, this.data );
+ }
+});
+
+$.extend( $.ui.accordion, {
+ version: "1.8.10",
+ animations: {
+ slide: function( options, additions ) {
+ options = $.extend({
+ easing: "swing",
+ duration: 300
+ }, options, additions );
+ if ( !options.toHide.size() ) {
+ options.toShow.animate({
+ height: "show",
+ paddingTop: "show",
+ paddingBottom: "show"
+ }, options );
+ return;
+ }
+ if ( !options.toShow.size() ) {
+ options.toHide.animate({
+ height: "hide",
+ paddingTop: "hide",
+ paddingBottom: "hide"
+ }, options );
+ return;
+ }
+ var overflow = options.toShow.css( "overflow" ),
+ percentDone = 0,
+ showProps = {},
+ hideProps = {},
+ fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
+ originalWidth;
+ // fix width before calculating height of hidden element
+ var s = options.toShow;
+ originalWidth = s[0].style.width;
+ s.width( parseInt( s.parent().width(), 10 )
+ - parseInt( s.css( "paddingLeft" ), 10 )
+ - parseInt( s.css( "paddingRight" ), 10 )
+ - ( parseInt( s.css( "borderLeftWidth" ), 10 ) || 0 )
+ - ( parseInt( s.css( "borderRightWidth" ), 10) || 0 ) );
+
+ $.each( fxAttrs, function( i, prop ) {
+ hideProps[ prop ] = "hide";
+
+ var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ );
+ showProps[ prop ] = {
+ value: parts[ 1 ],
+ unit: parts[ 2 ] || "px"
+ };
+ });
+ options.toShow.css({ height: 0, overflow: "hidden" }).show();
+ options.toHide
+ .filter( ":hidden" )
+ .each( options.complete )
+ .end()
+ .filter( ":visible" )
+ .animate( hideProps, {
+ step: function( now, settings ) {
+ // only calculate the percent when animating height
+ // IE gets very inconsistent results when animating elements
+ // with small values, which is common for padding
+ if ( settings.prop == "height" ) {
+ percentDone = ( settings.end - settings.start === 0 ) ? 0 :
+ ( settings.now - settings.start ) / ( settings.end - settings.start );
+ }
+
+ options.toShow[ 0 ].style[ settings.prop ] =
+ ( percentDone * showProps[ settings.prop ].value )
+ + showProps[ settings.prop ].unit;
+ },
+ duration: options.duration,
+ easing: options.easing,
+ complete: function() {
+ if ( !options.autoHeight ) {
+ options.toShow.css( "height", "" );
+ }
+ options.toShow.css({
+ width: originalWidth,
+ overflow: overflow
+ });
+ options.complete();
+ }
+ });
+ },
+ bounceslide: function( options ) {
+ this.slide( options, {
+ easing: options.down ? "easeOutBounce" : "swing",
+ duration: options.down ? 1000 : 200
+ });
+ }
+ }
+});
+
+})( jQuery );
--- /dev/null
+/*
+ * jQuery UI Autocomplete 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.position.js
+ */
+(function( $, undefined ) {
+
+// used to prevent race conditions with remote data sources
+var requestIndex = 0;
+
+$.widget( "ui.autocomplete", {
+ options: {
+ appendTo: "body",
+ delay: 300,
+ minLength: 1,
+ position: {
+ my: "left top",
+ at: "left bottom",
+ collision: "none"
+ },
+ source: null
+ },
+
+ pending: 0,
+
+ _create: function() {
+ var self = this,
+ doc = this.element[ 0 ].ownerDocument,
+ suppressKeyPress;
+
+ this.element
+ .addClass( "ui-autocomplete-input" )
+ .attr( "autocomplete", "off" )
+ // TODO verify these actually work as intended
+ .attr({
+ role: "textbox",
+ "aria-autocomplete": "list",
+ "aria-haspopup": "true"
+ })
+ .bind( "keydown.autocomplete", function( event ) {
+ if ( self.options.disabled || self.element.attr( "readonly" ) ) {
+ return;
+ }
+
+ suppressKeyPress = false;
+ var keyCode = $.ui.keyCode;
+ switch( event.keyCode ) {
+ case keyCode.PAGE_UP:
+ self._move( "previousPage", event );
+ break;
+ case keyCode.PAGE_DOWN:
+ self._move( "nextPage", event );
+ break;
+ case keyCode.UP:
+ self._move( "previous", event );
+ // prevent moving cursor to beginning of text field in some browsers
+ event.preventDefault();
+ break;
+ case keyCode.DOWN:
+ self._move( "next", event );
+ // prevent moving cursor to end of text field in some browsers
+ event.preventDefault();
+ break;
+ case keyCode.ENTER:
+ case keyCode.NUMPAD_ENTER:
+ // when menu is open and has focus
+ if ( self.menu.active ) {
+ // #6055 - Opera still allows the keypress to occur
+ // which causes forms to submit
+ suppressKeyPress = true;
+ event.preventDefault();
+ }
+ //passthrough - ENTER and TAB both select the current element
+ case keyCode.TAB:
+ if ( !self.menu.active ) {
+ return;
+ }
+ self.menu.select( event );
+ break;
+ case keyCode.ESCAPE:
+ self.element.val( self.term );
+ self.close( event );
+ break;
+ default:
+ // keypress is triggered before the input value is changed
+ clearTimeout( self.searching );
+ self.searching = setTimeout(function() {
+ // only search if the value has changed
+ if ( self.term != self.element.val() ) {
+ self.selectedItem = null;
+ self.search( null, event );
+ }
+ }, self.options.delay );
+ break;
+ }
+ })
+ .bind( "keypress.autocomplete", function( event ) {
+ if ( suppressKeyPress ) {
+ suppressKeyPress = false;
+ event.preventDefault();
+ }
+ })
+ .bind( "focus.autocomplete", function() {
+ if ( self.options.disabled ) {
+ return;
+ }
+
+ self.selectedItem = null;
+ self.previous = self.element.val();
+ })
+ .bind( "blur.autocomplete", function( event ) {
+ if ( self.options.disabled ) {
+ return;
+ }
+
+ clearTimeout( self.searching );
+ // clicks on the menu (or a button to trigger a search) will cause a blur event
+ self.closing = setTimeout(function() {
+ self.close( event );
+ self._change( event );
+ }, 150 );
+ });
+ this._initSource();
+ this.response = function() {
+ return self._response.apply( self, arguments );
+ };
+ this.menu = $( "<ul></ul>" )
+ .addClass( "ui-autocomplete" )
+ .appendTo( $( this.options.appendTo || "body", doc )[0] )
+ // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
+ .mousedown(function( event ) {
+ // clicking on the scrollbar causes focus to shift to the body
+ // but we can't detect a mouseup or a click immediately afterward
+ // so we have to track the next mousedown and close the menu if
+ // the user clicks somewhere outside of the autocomplete
+ var menuElement = self.menu.element[ 0 ];
+ if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
+ setTimeout(function() {
+ $( document ).one( 'mousedown', function( event ) {
+ if ( event.target !== self.element[ 0 ] &&
+ event.target !== menuElement &&
+ !$.ui.contains( menuElement, event.target ) ) {
+ self.close();
+ }
+ });
+ }, 1 );
+ }
+
+ // use another timeout to make sure the blur-event-handler on the input was already triggered
+ setTimeout(function() {
+ clearTimeout( self.closing );
+ }, 13);
+ })
+ .menu({
+ focus: function( event, ui ) {
+ var item = ui.item.data( "item.autocomplete" );
+ if ( false !== self._trigger( "focus", event, { item: item } ) ) {
+ // use value to match what will end up in the input, if it was a key event
+ if ( /^key/.test(event.originalEvent.type) ) {
+ self.element.val( item.value );
+ }
+ }
+ },
+ selected: function( event, ui ) {
+ var item = ui.item.data( "item.autocomplete" ),
+ previous = self.previous;
+
+ // only trigger when focus was lost (click on menu)
+ if ( self.element[0] !== doc.activeElement ) {
+ self.element.focus();
+ self.previous = previous;
+ // #6109 - IE triggers two focus events and the second
+ // is asynchronous, so we need to reset the previous
+ // term synchronously and asynchronously :-(
+ setTimeout(function() {
+ self.previous = previous;
+ self.selectedItem = item;
+ }, 1);
+ }
+
+ if ( false !== self._trigger( "select", event, { item: item } ) ) {
+ self.element.val( item.value );
+ }
+ // reset the term after the select event
+ // this allows custom select handling to work properly
+ self.term = self.element.val();
+
+ self.close( event );
+ self.selectedItem = item;
+ },
+ blur: function( event, ui ) {
+ // don't set the value of the text field if it's already correct
+ // this prevents moving the cursor unnecessarily
+ if ( self.menu.element.is(":visible") &&
+ ( self.element.val() !== self.term ) ) {
+ self.element.val( self.term );
+ }
+ }
+ })
+ .zIndex( this.element.zIndex() + 1 )
+ // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+ .css({ top: 0, left: 0 })
+ .hide()
+ .data( "menu" );
+ if ( $.fn.bgiframe ) {
+ this.menu.element.bgiframe();
+ }
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-autocomplete-input" )
+ .removeAttr( "autocomplete" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-autocomplete" )
+ .removeAttr( "aria-haspopup" );
+ this.menu.element.remove();
+ $.Widget.prototype.destroy.call( this );
+ },
+
+ _setOption: function( key, value ) {
+ $.Widget.prototype._setOption.apply( this, arguments );
+ if ( key === "source" ) {
+ this._initSource();
+ }
+ if ( key === "appendTo" ) {
+ this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
+ }
+ if ( key === "disabled" && value && this.xhr ) {
+ this.xhr.abort();
+ }
+ },
+
+ _initSource: function() {
+ var self = this,
+ array,
+ url;
+ if ( $.isArray(this.options.source) ) {
+ array = this.options.source;
+ this.source = function( request, response ) {
+ response( $.ui.autocomplete.filter(array, request.term) );
+ };
+ } else if ( typeof this.options.source === "string" ) {
+ url = this.options.source;
+ this.source = function( request, response ) {
+ if ( self.xhr ) {
+ self.xhr.abort();
+ }
+ self.xhr = $.ajax({
+ url: url,
+ data: request,
+ dataType: "json",
+ autocompleteRequest: ++requestIndex,
+ success: function( data, status ) {
+ if ( this.autocompleteRequest === requestIndex ) {
+ response( data );
+ }
+ },
+ error: function() {
+ if ( this.autocompleteRequest === requestIndex ) {
+ response( [] );
+ }
+ }
+ });
+ };
+ } else {
+ this.source = this.options.source;
+ }
+ },
+
+ search: function( value, event ) {
+ value = value != null ? value : this.element.val();
+
+ // always save the actual value, not the one passed as an argument
+ this.term = this.element.val();
+
+ if ( value.length < this.options.minLength ) {
+ return this.close( event );
+ }
+
+ clearTimeout( this.closing );
+ if ( this._trigger( "search", event ) === false ) {
+ return;
+ }
+
+ return this._search( value );
+ },
+
+ _search: function( value ) {
+ this.pending++;
+ this.element.addClass( "ui-autocomplete-loading" );
+
+ this.source( { term: value }, this.response );
+ },
+
+ _response: function( content ) {
+ if ( !this.options.disabled && content && content.length ) {
+ content = this._normalize( content );
+ this._suggest( content );
+ this._trigger( "open" );
+ } else {
+ this.close();
+ }
+ this.pending--;
+ if ( !this.pending ) {
+ this.element.removeClass( "ui-autocomplete-loading" );
+ }
+ },
+
+ close: function( event ) {
+ clearTimeout( this.closing );
+ if ( this.menu.element.is(":visible") ) {
+ this.menu.element.hide();
+ this.menu.deactivate();
+ this._trigger( "close", event );
+ }
+ },
+
+ _change: function( event ) {
+ if ( this.previous !== this.element.val() ) {
+ this._trigger( "change", event, { item: this.selectedItem } );
+ }
+ },
+
+ _normalize: function( items ) {
+ // assume all items have the right format when the first item is complete
+ if ( items.length && items[0].label && items[0].value ) {
+ return items;
+ }
+ return $.map( items, function(item) {
+ if ( typeof item === "string" ) {
+ return {
+ label: item,
+ value: item
+ };
+ }
+ return $.extend({
+ label: item.label || item.value,
+ value: item.value || item.label
+ }, item );
+ });
+ },
+
+ _suggest: function( items ) {
+ var ul = this.menu.element
+ .empty()
+ .zIndex( this.element.zIndex() + 1 );
+ this._renderMenu( ul, items );
+ // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
+ this.menu.deactivate();
+ this.menu.refresh();
+
+ // size and position menu
+ ul.show();
+ this._resizeMenu();
+ ul.position( $.extend({
+ of: this.element
+ }, this.options.position ));
+ },
+
+ _resizeMenu: function() {
+ var ul = this.menu.element;
+ ul.outerWidth( Math.max(
+ ul.width( "" ).outerWidth(),
+ this.element.outerWidth()
+ ) );
+ },
+
+ _renderMenu: function( ul, items ) {
+ var self = this;
+ $.each( items, function( index, item ) {
+ self._renderItem( ul, item );
+ });
+ },
+
+ _renderItem: function( ul, item) {
+ return $( "<li></li>" )
+ .data( "item.autocomplete", item )
+ .append( $( "<a></a>" ).text( item.label ) )
+ .appendTo( ul );
+ },
+
+ _move: function( direction, event ) {
+ if ( !this.menu.element.is(":visible") ) {
+ this.search( null, event );
+ return;
+ }
+ if ( this.menu.first() && /^previous/.test(direction) ||
+ this.menu.last() && /^next/.test(direction) ) {
+ this.element.val( this.term );
+ this.menu.deactivate();
+ return;
+ }
+ this.menu[ direction ]( event );
+ },
+
+ widget: function() {
+ return this.menu.element;
+ }
+});
+
+$.extend( $.ui.autocomplete, {
+ escapeRegex: function( value ) {
+ return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+ },
+ filter: function(array, term) {
+ var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
+ return $.grep( array, function(value) {
+ return matcher.test( value.label || value.value || value );
+ });
+ }
+});
+
+}( jQuery ));
+
+/*
+ * jQuery UI Menu (not officially released)
+ *
+ * This widget isn't yet finished and the API is subject to change. We plan to finish
+ * it for the next release. You're welcome to give it a try anyway and give us feedback,
+ * as long as you're okay with migrating your code later on. We can help with that, too.
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.menu", {
+ _create: function() {
+ var self = this;
+ this.element
+ .addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
+ .attr({
+ role: "listbox",
+ "aria-activedescendant": "ui-active-menuitem"
+ })
+ .click(function( event ) {
+ if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
+ return;
+ }
+ // temporary
+ event.preventDefault();
+ self.select( event );
+ });
+ this.refresh();
+ },
+
+ refresh: function() {
+ var self = this;
+
+ // don't refresh list items that are already adapted
+ var items = this.element.children("li:not(.ui-menu-item):has(a)")
+ .addClass("ui-menu-item")
+ .attr("role", "menuitem");
+
+ items.children("a")
+ .addClass("ui-corner-all")
+ .attr("tabindex", -1)
+ // mouseenter doesn't work with event delegation
+ .mouseenter(function( event ) {
+ self.activate( event, $(this).parent() );
+ })
+ .mouseleave(function() {
+ self.deactivate();
+ });
+ },
+
+ activate: function( event, item ) {
+ this.deactivate();
+ if (this.hasScroll()) {
+ var offset = item.offset().top - this.element.offset().top,
+ scroll = this.element.attr("scrollTop"),
+ elementHeight = this.element.height();
+ if (offset < 0) {
+ this.element.attr("scrollTop", scroll + offset);
+ } else if (offset >= elementHeight) {
+ this.element.attr("scrollTop", scroll + offset - elementHeight + item.height());
+ }
+ }
+ this.active = item.eq(0)
+ .children("a")
+ .addClass("ui-state-hover")
+ .attr("id", "ui-active-menuitem")
+ .end();
+ this._trigger("focus", event, { item: item });
+ },
+
+ deactivate: function() {
+ if (!this.active) { return; }
+
+ this.active.children("a")
+ .removeClass("ui-state-hover")
+ .removeAttr("id");
+ this._trigger("blur");
+ this.active = null;
+ },
+
+ next: function(event) {
+ this.move("next", ".ui-menu-item:first", event);
+ },
+
+ previous: function(event) {
+ this.move("prev", ".ui-menu-item:last", event);
+ },
+
+ first: function() {
+ return this.active && !this.active.prevAll(".ui-menu-item").length;
+ },
+
+ last: function() {
+ return this.active && !this.active.nextAll(".ui-menu-item").length;
+ },
+
+ move: function(direction, edge, event) {
+ if (!this.active) {
+ this.activate(event, this.element.children(edge));
+ return;
+ }
+ var next = this.active[direction + "All"](".ui-menu-item").eq(0);
+ if (next.length) {
+ this.activate(event, next);
+ } else {
+ this.activate(event, this.element.children(edge));
+ }
+ },
+
+ // TODO merge with previousPage
+ nextPage: function(event) {
+ if (this.hasScroll()) {
+ // TODO merge with no-scroll-else
+ if (!this.active || this.last()) {
+ this.activate(event, this.element.children(".ui-menu-item:first"));
+ return;
+ }
+ var base = this.active.offset().top,
+ height = this.element.height(),
+ result = this.element.children(".ui-menu-item").filter(function() {
+ var close = $(this).offset().top - base - height + $(this).height();
+ // TODO improve approximation
+ return close < 10 && close > -10;
+ });
+
+ // TODO try to catch this earlier when scrollTop indicates the last page anyway
+ if (!result.length) {
+ result = this.element.children(".ui-menu-item:last");
+ }
+ this.activate(event, result);
+ } else {
+ this.activate(event, this.element.children(".ui-menu-item")
+ .filter(!this.active || this.last() ? ":first" : ":last"));
+ }
+ },
+
+ // TODO merge with nextPage
+ previousPage: function(event) {
+ if (this.hasScroll()) {
+ // TODO merge with no-scroll-else
+ if (!this.active || this.first()) {
+ this.activate(event, this.element.children(".ui-menu-item:last"));
+ return;
+ }
+
+ var base = this.active.offset().top,
+ height = this.element.height();
+ result = this.element.children(".ui-menu-item").filter(function() {
+ var close = $(this).offset().top - base + height - $(this).height();
+ // TODO improve approximation
+ return close < 10 && close > -10;
+ });
+
+ // TODO try to catch this earlier when scrollTop indicates the last page anyway
+ if (!result.length) {
+ result = this.element.children(".ui-menu-item:first");
+ }
+ this.activate(event, result);
+ } else {
+ this.activate(event, this.element.children(".ui-menu-item")
+ .filter(!this.active || this.first() ? ":last" : ":first"));
+ }
+ },
+
+ hasScroll: function() {
+ return this.element.height() < this.element.attr("scrollHeight");
+ },
+
+ select: function( event ) {
+ this._trigger("selected", event, { item: this.active });
+ }
+});
+
+}(jQuery));
--- /dev/null
+/*
+ * jQuery UI Button 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var lastActive,
+ baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
+ stateClasses = "ui-state-hover ui-state-active ",
+ typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
+ formResetHandler = function( event ) {
+ $( ":ui-button", event.target.form ).each(function() {
+ var inst = $( this ).data( "button" );
+ setTimeout(function() {
+ inst.refresh();
+ }, 1 );
+ });
+ },
+ radioGroup = function( radio ) {
+ var name = radio.name,
+ form = radio.form,
+ radios = $( [] );
+ if ( name ) {
+ if ( form ) {
+ radios = $( form ).find( "[name='" + name + "']" );
+ } else {
+ radios = $( "[name='" + name + "']", radio.ownerDocument )
+ .filter(function() {
+ return !this.form;
+ });
+ }
+ }
+ return radios;
+ };
+
+$.widget( "ui.button", {
+ options: {
+ disabled: null,
+ text: true,
+ label: null,
+ icons: {
+ primary: null,
+ secondary: null
+ }
+ },
+ _create: function() {
+ this.element.closest( "form" )
+ .unbind( "reset.button" )
+ .bind( "reset.button", formResetHandler );
+
+ if ( typeof this.options.disabled !== "boolean" ) {
+ this.options.disabled = this.element.attr( "disabled" );
+ }
+
+ this._determineButtonType();
+ this.hasTitle = !!this.buttonElement.attr( "title" );
+
+ var self = this,
+ options = this.options,
+ toggleButton = this.type === "checkbox" || this.type === "radio",
+ hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
+ focusClass = "ui-state-focus";
+
+ if ( options.label === null ) {
+ options.label = this.buttonElement.html();
+ }
+
+ if ( this.element.is( ":disabled" ) ) {
+ options.disabled = true;
+ }
+
+ this.buttonElement
+ .addClass( baseClasses )
+ .attr( "role", "button" )
+ .bind( "mouseenter.button", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).addClass( "ui-state-hover" );
+ if ( this === lastActive ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ .bind( "mouseleave.button", function() {
+ if ( options.disabled ) {
+ return;
+ }
+ $( this ).removeClass( hoverClass );
+ })
+ .bind( "focus.button", function() {
+ // no need to check disabled, focus won't be triggered anyway
+ $( this ).addClass( focusClass );
+ })
+ .bind( "blur.button", function() {
+ $( this ).removeClass( focusClass );
+ });
+
+ if ( toggleButton ) {
+ this.element.bind( "change.button", function() {
+ self.refresh();
+ });
+ }
+
+ if ( this.type === "checkbox" ) {
+ this.buttonElement.bind( "click.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).toggleClass( "ui-state-active" );
+ self.buttonElement.attr( "aria-pressed", self.element[0].checked );
+ });
+ } else if ( this.type === "radio" ) {
+ this.buttonElement.bind( "click.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ self.buttonElement.attr( "aria-pressed", true );
+
+ var radio = self.element[ 0 ];
+ radioGroup( radio )
+ .not( radio )
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", false );
+ });
+ } else {
+ this.buttonElement
+ .bind( "mousedown.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).addClass( "ui-state-active" );
+ lastActive = this;
+ $( document ).one( "mouseup", function() {
+ lastActive = null;
+ });
+ })
+ .bind( "mouseup.button", function() {
+ if ( options.disabled ) {
+ return false;
+ }
+ $( this ).removeClass( "ui-state-active" );
+ })
+ .bind( "keydown.button", function(event) {
+ if ( options.disabled ) {
+ return false;
+ }
+ if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
+ $( this ).addClass( "ui-state-active" );
+ }
+ })
+ .bind( "keyup.button", function() {
+ $( this ).removeClass( "ui-state-active" );
+ });
+
+ if ( this.buttonElement.is("a") ) {
+ this.buttonElement.keyup(function(event) {
+ if ( event.keyCode === $.ui.keyCode.SPACE ) {
+ // TODO pass through original event correctly (just as 2nd argument doesn't work)
+ $( this ).click();
+ }
+ });
+ }
+ }
+
+ // TODO: pull out $.Widget's handling for the disabled option into
+ // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
+ // be overridden by individual plugins
+ this._setOption( "disabled", options.disabled );
+ },
+
+ _determineButtonType: function() {
+
+ if ( this.element.is(":checkbox") ) {
+ this.type = "checkbox";
+ } else {
+ if ( this.element.is(":radio") ) {
+ this.type = "radio";
+ } else {
+ if ( this.element.is("input") ) {
+ this.type = "input";
+ } else {
+ this.type = "button";
+ }
+ }
+ }
+
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ // we don't search against the document in case the element
+ // is disconnected from the DOM
+ this.buttonElement = this.element.parents().last()
+ .find( "label[for=" + this.element.attr("id") + "]" );
+ this.element.addClass( "ui-helper-hidden-accessible" );
+
+ var checked = this.element.is( ":checked" );
+ if ( checked ) {
+ this.buttonElement.addClass( "ui-state-active" );
+ }
+ this.buttonElement.attr( "aria-pressed", checked );
+ } else {
+ this.buttonElement = this.element;
+ }
+ },
+
+ widget: function() {
+ return this.buttonElement;
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-helper-hidden-accessible" );
+ this.buttonElement
+ .removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
+ .removeAttr( "role" )
+ .removeAttr( "aria-pressed" )
+ .html( this.buttonElement.find(".ui-button-text").html() );
+
+ if ( !this.hasTitle ) {
+ this.buttonElement.removeAttr( "title" );
+ }
+
+ $.Widget.prototype.destroy.call( this );
+ },
+
+ _setOption: function( key, value ) {
+ $.Widget.prototype._setOption.apply( this, arguments );
+ if ( key === "disabled" ) {
+ if ( value ) {
+ this.element.attr( "disabled", true );
+ } else {
+ this.element.removeAttr( "disabled" );
+ }
+ }
+ this._resetButton();
+ },
+
+ refresh: function() {
+ var isDisabled = this.element.is( ":disabled" );
+ if ( isDisabled !== this.options.disabled ) {
+ this._setOption( "disabled", isDisabled );
+ }
+ if ( this.type === "radio" ) {
+ radioGroup( this.element[0] ).each(function() {
+ if ( $( this ).is( ":checked" ) ) {
+ $( this ).button( "widget" )
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", true );
+ } else {
+ $( this ).button( "widget" )
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", false );
+ }
+ });
+ } else if ( this.type === "checkbox" ) {
+ if ( this.element.is( ":checked" ) ) {
+ this.buttonElement
+ .addClass( "ui-state-active" )
+ .attr( "aria-pressed", true );
+ } else {
+ this.buttonElement
+ .removeClass( "ui-state-active" )
+ .attr( "aria-pressed", false );
+ }
+ }
+ },
+
+ _resetButton: function() {
+ if ( this.type === "input" ) {
+ if ( this.options.label ) {
+ this.element.val( this.options.label );
+ }
+ return;
+ }
+ var buttonElement = this.buttonElement.removeClass( typeClasses ),
+ buttonText = $( "<span></span>" )
+ .addClass( "ui-button-text" )
+ .html( this.options.label )
+ .appendTo( buttonElement.empty() )
+ .text(),
+ icons = this.options.icons,
+ multipleIcons = icons.primary && icons.secondary,
+ buttonClasses = [];
+
+ if ( icons.primary || icons.secondary ) {
+ buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
+
+ if ( icons.primary ) {
+ buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
+ }
+
+ if ( icons.secondary ) {
+ buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
+ }
+
+ if ( !this.options.text ) {
+ buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
+ buttonElement.removeClass( "ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary" );
+
+ if ( !this.hasTitle ) {
+ buttonElement.attr( "title", buttonText );
+ }
+ }
+ } else {
+ buttonClasses.push( "ui-button-text-only" );
+ }
+ buttonElement.addClass( buttonClasses.join( " " ) );
+ }
+});
+
+$.widget( "ui.buttonset", {
+ options: {
+ items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
+ },
+
+ _create: function() {
+ this.element.addClass( "ui-buttonset" );
+ },
+
+ _init: function() {
+ this.refresh();
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "disabled" ) {
+ this.buttons.button( "option", key, value );
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+ },
+
+ refresh: function() {
+ this.buttons = this.element.find( this.options.items )
+ .filter( ":ui-button" )
+ .button( "refresh" )
+ .end()
+ .not( ":ui-button" )
+ .button()
+ .end()
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+ .filter( ":first" )
+ .addClass( "ui-corner-left" )
+ .end()
+ .filter( ":last" )
+ .addClass( "ui-corner-right" )
+ .end()
+ .end();
+ },
+
+ destroy: function() {
+ this.element.removeClass( "ui-buttonset" );
+ this.buttons
+ .map(function() {
+ return $( this ).button( "widget" )[ 0 ];
+ })
+ .removeClass( "ui-corner-left ui-corner-right" )
+ .end()
+ .button( "destroy" );
+
+ $.Widget.prototype.destroy.call( this );
+ }
+});
+
+}( jQuery ) );
--- /dev/null
+/*!
+ * jQuery UI 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function( $, undefined ) {
+
+// prevent duplicate loading
+// this is only a problem because we proxy existing functions
+// and we don't want to double proxy them
+$.ui = $.ui || {};
+if ( $.ui.version ) {
+ return;
+}
+
+$.extend( $.ui, {
+ version: "1.8.10",
+
+ keyCode: {
+ ALT: 18,
+ BACKSPACE: 8,
+ CAPS_LOCK: 20,
+ COMMA: 188,
+ COMMAND: 91,
+ COMMAND_LEFT: 91, // COMMAND
+ COMMAND_RIGHT: 93,
+ CONTROL: 17,
+ DELETE: 46,
+ DOWN: 40,
+ END: 35,
+ ENTER: 13,
+ ESCAPE: 27,
+ HOME: 36,
+ INSERT: 45,
+ LEFT: 37,
+ MENU: 93, // COMMAND_RIGHT
+ NUMPAD_ADD: 107,
+ NUMPAD_DECIMAL: 110,
+ NUMPAD_DIVIDE: 111,
+ NUMPAD_ENTER: 108,
+ NUMPAD_MULTIPLY: 106,
+ NUMPAD_SUBTRACT: 109,
+ PAGE_DOWN: 34,
+ PAGE_UP: 33,
+ PERIOD: 190,
+ RIGHT: 39,
+ SHIFT: 16,
+ SPACE: 32,
+ TAB: 9,
+ UP: 38,
+ WINDOWS: 91 // COMMAND
+ }
+});
+
+// plugins
+$.fn.extend({
+ _focus: $.fn.focus,
+ focus: function( delay, fn ) {
+ return typeof delay === "number" ?
+ this.each(function() {
+ var elem = this;
+ setTimeout(function() {
+ $( elem ).focus();
+ if ( fn ) {
+ fn.call( elem );
+ }
+ }, delay );
+ }) :
+ this._focus.apply( this, arguments );
+ },
+
+ scrollParent: function() {
+ var scrollParent;
+ if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+ scrollParent = this.parents().filter(function() {
+ return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+ }).eq(0);
+ } else {
+ scrollParent = this.parents().filter(function() {
+ return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+ }).eq(0);
+ }
+
+ return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
+ },
+
+ zIndex: function( zIndex ) {
+ if ( zIndex !== undefined ) {
+ return this.css( "zIndex", zIndex );
+ }
+
+ if ( this.length ) {
+ var elem = $( this[ 0 ] ), position, value;
+ while ( elem.length && elem[ 0 ] !== document ) {
+ // Ignore z-index if position is set to a value where z-index is ignored by the browser
+ // This makes behavior of this function consistent across browsers
+ // WebKit always returns auto if the element is positioned
+ position = elem.css( "position" );
+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+ // IE returns 0 when zIndex is not specified
+ // other browsers return a string
+ // we ignore the case of nested elements with an explicit value of 0
+ // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+ value = parseInt( elem.css( "zIndex" ), 10 );
+ if ( !isNaN( value ) && value !== 0 ) {
+ return value;
+ }
+ }
+ elem = elem.parent();
+ }
+ }
+
+ return 0;
+ },
+
+ disableSelection: function() {
+ return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+ ".ui-disableSelection", function( event ) {
+ event.preventDefault();
+ });
+ },
+
+ enableSelection: function() {
+ return this.unbind( ".ui-disableSelection" );
+ }
+});
+
+$.each( [ "Width", "Height" ], function( i, name ) {
+ var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+ type = name.toLowerCase(),
+ orig = {
+ innerWidth: $.fn.innerWidth,
+ innerHeight: $.fn.innerHeight,
+ outerWidth: $.fn.outerWidth,
+ outerHeight: $.fn.outerHeight
+ };
+
+ function reduce( elem, size, border, margin ) {
+ $.each( side, function() {
+ size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
+ if ( border ) {
+ size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
+ }
+ if ( margin ) {
+ size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
+ }
+ });
+ return size;
+ }
+
+ $.fn[ "inner" + name ] = function( size ) {
+ if ( size === undefined ) {
+ return orig[ "inner" + name ].call( this );
+ }
+
+ return this.each(function() {
+ $( this ).css( type, reduce( this, size ) + "px" );
+ });
+ };
+
+ $.fn[ "outer" + name] = function( size, margin ) {
+ if ( typeof size !== "number" ) {
+ return orig[ "outer" + name ].call( this, size );
+ }
+
+ return this.each(function() {
+ $( this).css( type, reduce( this, size, true, margin ) + "px" );
+ });
+ };
+});
+
+// selectors
+function visible( element ) {
+ return !$( element ).parents().andSelf().filter(function() {
+ return $.curCSS( this, "visibility" ) === "hidden" ||
+ $.expr.filters.hidden( this );
+ }).length;
+}
+
+$.extend( $.expr[ ":" ], {
+ data: function( elem, i, match ) {
+ return !!$.data( elem, match[ 3 ] );
+ },
+
+ focusable: function( element ) {
+ var nodeName = element.nodeName.toLowerCase(),
+ tabIndex = $.attr( element, "tabindex" );
+ if ( "area" === nodeName ) {
+ var map = element.parentNode,
+ mapName = map.name,
+ img;
+ if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+ return false;
+ }
+ img = $( "img[usemap=#" + mapName + "]" )[0];
+ return !!img && visible( img );
+ }
+ return ( /input|select|textarea|button|object/.test( nodeName )
+ ? !element.disabled
+ : "a" == nodeName
+ ? element.href || !isNaN( tabIndex )
+ : !isNaN( tabIndex ))
+ // the element and all of its ancestors must be visible
+ && visible( element );
+ },
+
+ tabbable: function( element ) {
+ var tabIndex = $.attr( element, "tabindex" );
+ return ( isNaN( tabIndex ) || tabIndex >= 0 ) && $( element ).is( ":focusable" );
+ }
+});
+
+// support
+$(function() {
+ var body = document.body,
+ div = body.appendChild( div = document.createElement( "div" ) );
+
+ $.extend( div.style, {
+ minHeight: "100px",
+ height: "auto",
+ padding: 0,
+ borderWidth: 0
+ });
+
+ $.support.minHeight = div.offsetHeight === 100;
+ $.support.selectstart = "onselectstart" in div;
+
+ // set display to none to avoid a layout bug in IE
+ // http://dev.jquery.com/ticket/4014
+ body.removeChild( div ).style.display = "none";
+});
+
+
+
+
+
+// deprecated
+$.extend( $.ui, {
+ // $.ui.plugin is deprecated. Use the proxy pattern instead.
+ plugin: {
+ add: function( module, option, set ) {
+ var proto = $.ui[ module ].prototype;
+ for ( var i in set ) {
+ proto.plugins[ i ] = proto.plugins[ i ] || [];
+ proto.plugins[ i ].push( [ option, set[ i ] ] );
+ }
+ },
+ call: function( instance, name, args ) {
+ var set = instance.plugins[ name ];
+ if ( !set || !instance.element[ 0 ].parentNode ) {
+ return;
+ }
+
+ for ( var i = 0; i < set.length; i++ ) {
+ if ( instance.options[ set[ i ][ 0 ] ] ) {
+ set[ i ][ 1 ].apply( instance.element, args );
+ }
+ }
+ }
+ },
+
+ // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
+ contains: function( a, b ) {
+ return document.compareDocumentPosition ?
+ a.compareDocumentPosition( b ) & 16 :
+ a !== b && a.contains( b );
+ },
+
+ // only used by resizable
+ hasScroll: function( el, a ) {
+
+ //If overflow is hidden, the element might have extra content, but the user wants to hide it
+ if ( $( el ).css( "overflow" ) === "hidden") {
+ return false;
+ }
+
+ var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
+ has = false;
+
+ if ( el[ scroll ] > 0 ) {
+ return true;
+ }
+
+ // TODO: determine which cases actually cause this to happen
+ // if the element doesn't have the scroll set, see if it's possible to
+ // set the scroll
+ el[ scroll ] = 1;
+ has = ( el[ scroll ] > 0 );
+ el[ scroll ] = 0;
+ return has;
+ },
+
+ // these are odd functions, fix the API or move into individual plugins
+ isOverAxis: function( x, reference, size ) {
+ //Determines when x coordinate is over "b" element axis
+ return ( x > reference ) && ( x < ( reference + size ) );
+ },
+ isOver: function( y, x, top, left, height, width ) {
+ //Determines when x, y coordinates is over "b" element
+ return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
+ }
+});
+
+})( jQuery );
--- /dev/null
+/*
+ * jQuery UI Datepicker 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ * jquery.ui.core.js
+ */
+(function( $, undefined ) {
+
+$.extend($.ui, { datepicker: { version: "1.8.10" } });
+
+var PROP_NAME = 'datepicker';
+var dpuuid = new Date().getTime();
+
+/* Date picker manager.
+ Use the singleton instance of this class, $.datepicker, to interact with the date picker.
+ Settings for (groups of) date pickers are maintained in an instance object,
+ allowing multiple different settings on the same page. */
+
+function Datepicker() {
+ this.debug = false; // Change this to true to start debugging
+ this._curInst = null; // The current instance in use
+ this._keyEvent = false; // If the last event was a key event
+ this._disabledInputs = []; // List of date picker inputs that have been disabled
+ this._datepickerShowing = false; // True if the popup picker is showing , false if not
+ this._inDialog = false; // True if showing within a "dialog", false if not
+ this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
+ this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
+ this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
+ this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
+ this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
+ this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
+ this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
+ this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
+ this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
+ this.regional = []; // Available regional settings, indexed by language code
+ this.regional[''] = { // Default regional settings
+ closeText: 'Done', // Display text for close link
+ prevText: 'Prev', // Display text for previous month link
+ nextText: 'Next', // Display text for next month link
+ currentText: 'Today', // Display text for current month link
+ monthNames: ['January','February','March','April','May','June',
+ 'July','August','September','October','November','December'], // Names of months for drop-down and formatting
+ monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
+ dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
+ dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
+ weekHeader: 'Wk', // Column header for week of the year
+ dateFormat: 'mm/dd/yy', // See format options on parseDate
+ firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+ isRTL: false, // True if right-to-left language, false if left-to-right
+ showMonthAfterYear: false, // True if the year select precedes month, false for month then year
+ yearSuffix: '' // Additional text to append to the year in the month headers
+ };
+ this._defaults = { // Global defaults for all the date picker instances
+ showOn: 'focus', // 'focus' for popup on focus,
+ // 'button' for trigger button, or 'both' for either
+ showAnim: 'fadeIn', // Name of jQuery animation for popup
+ showOptions: {}, // Options for enhanced animations
+ defaultDate: null, // Used when field is blank: actual date,
+ // +/-number for offset from today, null for today
+ appendText: '', // Display text following the input box, e.g. showing the format
+ buttonText: '...', // Text for trigger button
+ buttonImage: '', // URL for trigger button image
+ buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
+ hideIfNoPrevNext: false, // True to hide next/previous month links
+ // if not applicable, false to just disable them
+ navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
+ gotoCurrent: false, // True if today link goes back to current selection instead
+ changeMonth: false, // True if month can be selected directly, false if only prev/next
+ changeYear: false, // True if year can be selected directly, false if only prev/next
+ yearRange: 'c-10:c+10', // Range of years to display in drop-down,
+ // either relative to today's year (-nn:+nn), relative to currently displayed year
+ // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+ showOtherMonths: false, // True to show dates in other months, false to leave blank
+ selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
+ showWeek: false, // True to show week of the year, false to not show it
+ calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+ // takes a Date and returns the number of the week for it
+ shortYearCutoff: '+10', // Short year values < this are in the current century,
+ // > this are in the previous century,
+ // string value starting with '+' for current year + value
+ minDate: null, // The earliest selectable date, or null for no limit
+ maxDate: null, // The latest selectable date, or null for no limit
+ duration: 'fast', // Duration of display/closure
+ beforeShowDay: null, // Function that takes a date and returns an array with
+ // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
+ // [2] = cell title (optional), e.g. $.datepicker.noWeekends
+ beforeShow: null, // Function that takes an input field and
+ // returns a set of custom settings for the date picker
+ onSelect: null, // Define a callback function when a date is selected
+ onChangeMonthYear: null, // Define a callback function when the month or year is changed
+ onClose: null, // Define a callback function when the datepicker is closed
+ numberOfMonths: 1, // Number of months to show at a time
+ showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
+ stepMonths: 1, // Number of months to step back/forward
+ stepBigMonths: 12, // Number of months to step back/forward for the big links
+ altField: '', // Selector for an alternate field to store selected dates into
+ altFormat: '', // The date format to use for the alternate field
+ constrainInput: true, // The input is constrained by the current date format
+ showButtonPanel: false, // True to show button panel, false to not show it
+ autoSize: false // True to size the input for the date format, false to leave as is
+ };
+ $.extend(this._defaults, this.regional['']);
+ this.dpDiv = $('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>');
+}
+
+$.extend(Datepicker.prototype, {
+ /* Class name added to elements to indicate already configured with a date picker. */
+ markerClassName: 'hasDatepicker',
+
+ /* Debug logging (if enabled). */
+ log: function () {
+ if (this.debug)
+ console.log.apply('', arguments);
+ },
+
+ // TODO rename to "widget" when switching to widget factory
+ _widgetDatepicker: function() {
+ return this.dpDiv;
+ },
+
+ /* Override the default settings for all instances of the date picker.
+ @param settings object - the new settings to use as defaults (anonymous object)
+ @return the manager object */
+ setDefaults: function(settings) {
+ extendRemove(this._defaults, settings || {});
+ return this;
+ },
+
+ /* Attach the date picker to a jQuery selection.
+ @param target element - the target input field or division or span
+ @param settings object - the new settings to use for this date picker instance (anonymous) */
+ _attachDatepicker: function(target, settings) {
+ // check for settings on the control itself - in namespace 'date:'
+ var inlineSettings = null;
+ for (var attrName in this._defaults) {
+ var attrValue = target.getAttribute('date:' + attrName);
+ if (attrValue) {
+ inlineSettings = inlineSettings || {};
+ try {
+ inlineSettings[attrName] = eval(attrValue);
+ } catch (err) {
+ inlineSettings[attrName] = attrValue;
+ }
+ }
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ var inline = (nodeName == 'div' || nodeName == 'span');
+ if (!target.id) {
+ this.uuid += 1;
+ target.id = 'dp' + this.uuid;
+ }
+ var inst = this._newInst($(target), inline);
+ inst.settings = $.extend({}, settings || {}, inlineSettings || {});
+ if (nodeName == 'input') {
+ this._connectDatepicker(target, inst);
+ } else if (inline) {
+ this._inlineDatepicker(target, inst);
+ }
+ },
+
+ /* Create a new instance object. */
+ _newInst: function(target, inline) {
+ var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
+ return {id: id, input: target, // associated target
+ selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+ drawMonth: 0, drawYear: 0, // month being drawn
+ inline: inline, // is datepicker inline or not
+ dpDiv: (!inline ? this.dpDiv : // presentation div
+ $('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))};
+ },
+
+ /* Attach the date picker to an input field. */
+ _connectDatepicker: function(target, inst) {
+ var input = $(target);
+ inst.append = $([]);
+ inst.trigger = $([]);
+ if (input.hasClass(this.markerClassName))
+ return;
+ this._attachments(input, inst);
+ input.addClass(this.markerClassName).keydown(this._doKeyDown).
+ keypress(this._doKeyPress).keyup(this._doKeyUp).
+ bind("setData.datepicker", function(event, key, value) {
+ inst.settings[key] = value;
+ }).bind("getData.datepicker", function(event, key) {
+ return this._get(inst, key);
+ });
+ this._autoSize(inst);
+ $.data(target, PROP_NAME, inst);
+ },
+
+ /* Make attachments based on settings. */
+ _attachments: function(input, inst) {
+ var appendText = this._get(inst, 'appendText');
+ var isRTL = this._get(inst, 'isRTL');
+ if (inst.append)
+ inst.append.remove();
+ if (appendText) {
+ inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
+ input[isRTL ? 'before' : 'after'](inst.append);
+ }
+ input.unbind('focus', this._showDatepicker);
+ if (inst.trigger)
+ inst.trigger.remove();
+ var showOn = this._get(inst, 'showOn');
+ if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
+ input.focus(this._showDatepicker);
+ if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
+ var buttonText = this._get(inst, 'buttonText');
+ var buttonImage = this._get(inst, 'buttonImage');
+ inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
+ $('<img/>').addClass(this._triggerClass).
+ attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
+ $('<button type="button"></button>').addClass(this._triggerClass).
+ html(buttonImage == '' ? buttonText : $('<img/>').attr(
+ { src:buttonImage, alt:buttonText, title:buttonText })));
+ input[isRTL ? 'before' : 'after'](inst.trigger);
+ inst.trigger.click(function() {
+ if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
+ $.datepicker._hideDatepicker();
+ else
+ $.datepicker._showDatepicker(input[0]);
+ return false;
+ });
+ }
+ },
+
+ /* Apply the maximum length for the date format. */
+ _autoSize: function(inst) {
+ if (this._get(inst, 'autoSize') && !inst.inline) {
+ var date = new Date(2009, 12 - 1, 20); // Ensure double digits
+ var dateFormat = this._get(inst, 'dateFormat');
+ if (dateFormat.match(/[DM]/)) {
+ var findMax = function(names) {
+ var max = 0;
+ var maxI = 0;
+ for (var i = 0; i < names.length; i++) {
+ if (names[i].length > max) {
+ max = names[i].length;
+ maxI = i;
+ }
+ }
+ return maxI;
+ };
+ date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
+ 'monthNames' : 'monthNamesShort'))));
+ date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
+ 'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
+ }
+ inst.input.attr('size', this._formatDate(inst, date).length);
+ }
+ },
+
+ /* Attach an inline date picker to a div. */
+ _inlineDatepicker: function(target, inst) {
+ var divSpan = $(target);
+ if (divSpan.hasClass(this.markerClassName))
+ return;
+ divSpan.addClass(this.markerClassName).append(inst.dpDiv).
+ bind("setData.datepicker", function(event, key, value){
+ inst.settings[key] = value;
+ }).bind("getData.datepicker", function(event, key){
+ return this._get(inst, key);
+ });
+ $.data(target, PROP_NAME, inst);
+ this._setDate(inst, this._getDefaultDate(inst), true);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ inst.dpDiv.show();
+ },
+
+ /* Pop-up the date picker in a "dialog" box.
+ @param input element - ignored
+ @param date string or Date - the initial date to display
+ @param onSelect function - the function to call when a date is selected
+ @param settings object - update the dialog date picker instance's settings (anonymous object)
+ @param pos int[2] - coordinates for the dialog's position within the screen or
+ event - with x/y coordinates or
+ leave empty for default (screen centre)
+ @return the manager object */
+ _dialogDatepicker: function(input, date, onSelect, settings, pos) {
+ var inst = this._dialogInst; // internal instance
+ if (!inst) {
+ this.uuid += 1;
+ var id = 'dp' + this.uuid;
+ this._dialogInput = $('<input type="text" id="' + id +
+ '" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');
+ this._dialogInput.keydown(this._doKeyDown);
+ $('body').append(this._dialogInput);
+ inst = this._dialogInst = this._newInst(this._dialogInput, false);
+ inst.settings = {};
+ $.data(this._dialogInput[0], PROP_NAME, inst);
+ }
+ extendRemove(inst.settings, settings || {});
+ date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
+ this._dialogInput.val(date);
+
+ this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
+ if (!this._pos) {
+ var browserWidth = document.documentElement.clientWidth;
+ var browserHeight = document.documentElement.clientHeight;
+ var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+ var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+ this._pos = // should use actual width/height below
+ [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
+ }
+
+ // move input on screen for focus, but hidden behind dialog
+ this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
+ inst.settings.onSelect = onSelect;
+ this._inDialog = true;
+ this.dpDiv.addClass(this._dialogClass);
+ this._showDatepicker(this._dialogInput[0]);
+ if ($.blockUI)
+ $.blockUI(this.dpDiv);
+ $.data(this._dialogInput[0], PROP_NAME, inst);
+ return this;
+ },
+
+ /* Detach a datepicker from its control.
+ @param target element - the target input field or division or span */
+ _destroyDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ $.removeData(target, PROP_NAME);
+ if (nodeName == 'input') {
+ inst.append.remove();
+ inst.trigger.remove();
+ $target.removeClass(this.markerClassName).
+ unbind('focus', this._showDatepicker).
+ unbind('keydown', this._doKeyDown).
+ unbind('keypress', this._doKeyPress).
+ unbind('keyup', this._doKeyUp);
+ } else if (nodeName == 'div' || nodeName == 'span')
+ $target.removeClass(this.markerClassName).empty();
+ },
+
+ /* Enable the date picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _enableDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = false;
+ inst.trigger.filter('button').
+ each(function() { this.disabled = false; }).end().
+ filter('img').css({opacity: '1.0', cursor: ''});
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().removeClass('ui-state-disabled');
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target ? null : value); }); // delete entry
+ },
+
+ /* Disable the date picker to a jQuery selection.
+ @param target element - the target input field or division or span */
+ _disableDatepicker: function(target) {
+ var $target = $(target);
+ var inst = $.data(target, PROP_NAME);
+ if (!$target.hasClass(this.markerClassName)) {
+ return;
+ }
+ var nodeName = target.nodeName.toLowerCase();
+ if (nodeName == 'input') {
+ target.disabled = true;
+ inst.trigger.filter('button').
+ each(function() { this.disabled = true; }).end().
+ filter('img').css({opacity: '0.5', cursor: 'default'});
+ }
+ else if (nodeName == 'div' || nodeName == 'span') {
+ var inline = $target.children('.' + this._inlineClass);
+ inline.children().addClass('ui-state-disabled');
+ }
+ this._disabledInputs = $.map(this._disabledInputs,
+ function(value) { return (value == target ? null : value); }); // delete entry
+ this._disabledInputs[this._disabledInputs.length] = target;
+ },
+
+ /* Is the first field in a jQuery collection disabled as a datepicker?
+ @param target element - the target input field or division or span
+ @return boolean - true if disabled, false if enabled */
+ _isDisabledDatepicker: function(target) {
+ if (!target) {
+ return false;
+ }
+ for (var i = 0; i < this._disabledInputs.length; i++) {
+ if (this._disabledInputs[i] == target)
+ return true;
+ }
+ return false;
+ },
+
+ /* Retrieve the instance data for the target control.
+ @param target element - the target input field or division or span
+ @return object - the associated instance data
+ @throws error if a jQuery problem getting data */
+ _getInst: function(target) {
+ try {
+ return $.data(target, PROP_NAME);
+ }
+ catch (err) {
+ throw 'Missing instance data for this datepicker';
+ }
+ },
+
+ /* Update or retrieve the settings for a date picker attached to an input field or division.
+ @param target element - the target input field or division or span
+ @param name object - the new settings to update or
+ string - the name of the setting to change or retrieve,
+ when retrieving also 'all' for all instance settings or
+ 'defaults' for all global defaults
+ @param value any - the new value for the setting
+ (omit if above is an object or to retrieve a value) */
+ _optionDatepicker: function(target, name, value) {
+ var inst = this._getInst(target);
+ if (arguments.length == 2 && typeof name == 'string') {
+ return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
+ (inst ? (name == 'all' ? $.extend({}, inst.settings) :
+ this._get(inst, name)) : null));
+ }
+ var settings = name || {};
+ if (typeof name == 'string') {
+ settings = {};
+ settings[name] = value;
+ }
+ if (inst) {
+ if (this._curInst == inst) {
+ this._hideDatepicker();
+ }
+ var date = this._getDateDatepicker(target, true);
+ extendRemove(inst.settings, settings);
+ this._attachments($(target), inst);
+ this._autoSize(inst);
+ this._setDateDatepicker(target, date);
+ this._updateDatepicker(inst);
+ }
+ },
+
+ // change method deprecated
+ _changeDatepicker: function(target, name, value) {
+ this._optionDatepicker(target, name, value);
+ },
+
+ /* Redraw the date picker attached to an input field or division.
+ @param target element - the target input field or division or span */
+ _refreshDatepicker: function(target) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._updateDatepicker(inst);
+ }
+ },
+
+ /* Set the dates for a jQuery selection.
+ @param target element - the target input field or division or span
+ @param date Date - the new date */
+ _setDateDatepicker: function(target, date) {
+ var inst = this._getInst(target);
+ if (inst) {
+ this._setDate(inst, date);
+ this._updateDatepicker(inst);
+ this._updateAlternate(inst);
+ }
+ },
+
+ /* Get the date(s) for the first entry in a jQuery selection.
+ @param target element - the target input field or division or span
+ @param noDefault boolean - true if no default date is to be used
+ @return Date - the current date */
+ _getDateDatepicker: function(target, noDefault) {
+ var inst = this._getInst(target);
+ if (inst && !inst.inline)
+ this._setDateFromField(inst, noDefault);
+ return (inst ? this._getDate(inst) : null);
+ },
+
+ /* Handle keystrokes. */
+ _doKeyDown: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ var handled = true;
+ var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
+ inst._keyEvent = true;
+ if ($.datepicker._datepickerShowing)
+ switch (event.keyCode) {
+ case 9: $.datepicker._hideDatepicker();
+ handled = false;
+ break; // hide on tab out
+ case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' +
+ $.datepicker._currentClass + ')', inst.dpDiv);
+ if (sel[0])
+ $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
+ else
+ $.datepicker._hideDatepicker();
+ return false; // don't submit the form
+ break; // select the value on enter
+ case 27: $.datepicker._hideDatepicker();
+ break; // hide on escape
+ case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, 'stepBigMonths') :
+ -$.datepicker._get(inst, 'stepMonths')), 'M');
+ break; // previous month/year on page up/+ ctrl
+ case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, 'stepBigMonths') :
+ +$.datepicker._get(inst, 'stepMonths')), 'M');
+ break; // next month/year on page down/+ ctrl
+ case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
+ handled = event.ctrlKey || event.metaKey;
+ break; // clear on ctrl or command +end
+ case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
+ handled = event.ctrlKey || event.metaKey;
+ break; // current on ctrl or command +home
+ case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
+ handled = event.ctrlKey || event.metaKey;
+ // -1 day on ctrl or command +left
+ if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ -$.datepicker._get(inst, 'stepBigMonths') :
+ -$.datepicker._get(inst, 'stepMonths')), 'M');
+ // next month/year on alt +left on Mac
+ break;
+ case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
+ handled = event.ctrlKey || event.metaKey;
+ break; // -1 week on ctrl or command +up
+ case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
+ handled = event.ctrlKey || event.metaKey;
+ // +1 day on ctrl or command +right
+ if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+ +$.datepicker._get(inst, 'stepBigMonths') :
+ +$.datepicker._get(inst, 'stepMonths')), 'M');
+ // next month/year on alt +right
+ break;
+ case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
+ handled = event.ctrlKey || event.metaKey;
+ break; // +1 week on ctrl or command +down
+ default: handled = false;
+ }
+ else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
+ $.datepicker._showDatepicker(this);
+ else {
+ handled = false;
+ }
+ if (handled) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /* Filter entered characters - based on date format. */
+ _doKeyPress: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ if ($.datepicker._get(inst, 'constrainInput')) {
+ var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
+ var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
+ return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
+ }
+ },
+
+ /* Synchronise manual entry and field/alternate field. */
+ _doKeyUp: function(event) {
+ var inst = $.datepicker._getInst(event.target);
+ if (inst.input.val() != inst.lastVal) {
+ try {
+ var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+ (inst.input ? inst.input.val() : null),
+ $.datepicker._getFormatConfig(inst));
+ if (date) { // only if valid
+ $.datepicker._setDateFromField(inst);
+ $.datepicker._updateAlternate(inst);
+ $.datepicker._updateDatepicker(inst);
+ }
+ }
+ catch (event) {
+ $.datepicker.log(event);
+ }
+ }
+ return true;
+ },
+
+ /* Pop-up the date picker for a given input field.
+ @param input element - the input field attached to the date picker or
+ event - if triggered by focus */
+ _showDatepicker: function(input) {
+ input = input.target || input;
+ if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
+ input = $('input', input.parentNode)[0];
+ if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
+ return;
+ var inst = $.datepicker._getInst(input);
+ if ($.datepicker._curInst && $.datepicker._curInst != inst) {
+ $.datepicker._curInst.dpDiv.stop(true, true);
+ }
+ var beforeShow = $.datepicker._get(inst, 'beforeShow');
+ extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
+ inst.lastVal = null;
+ $.datepicker._lastInput = input;
+ $.datepicker._setDateFromField(inst);
+ if ($.datepicker._inDialog) // hide cursor
+ input.value = '';
+ if (!$.datepicker._pos) { // position below input
+ $.datepicker._pos = $.datepicker._findPos(input);
+ $.datepicker._pos[1] += input.offsetHeight; // add the height
+ }
+ var isFixed = false;
+ $(input).parents().each(function() {
+ isFixed |= $(this).css('position') == 'fixed';
+ return !isFixed;
+ });
+ if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
+ $.datepicker._pos[0] -= document.documentElement.scrollLeft;
+ $.datepicker._pos[1] -= document.documentElement.scrollTop;
+ }
+ var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
+ $.datepicker._pos = null;
+ //to avoid flashes on Firefox
+ inst.dpDiv.empty();
+ // determine sizing offscreen
+ inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
+ $.datepicker._updateDatepicker(inst);
+ // fix width for dynamic number of date pickers
+ // and adjust position before showing
+ offset = $.datepicker._checkOffset(inst, offset, isFixed);
+ inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
+ 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
+ left: offset.left + 'px', top: offset.top + 'px'});
+ if (!inst.inline) {
+ var showAnim = $.datepicker._get(inst, 'showAnim');
+ var duration = $.datepicker._get(inst, 'duration');
+ var postProcess = function() {
+ $.datepicker._datepickerShowing = true;
+ var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+ if( !! cover.length ){
+ var borders = $.datepicker._getBorders(inst.dpDiv);
+ cover.css({left: -borders[0], top: -borders[1],
+ width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
+ }
+ };
+ inst.dpDiv.zIndex($(input).zIndex()+1);
+ if ($.effects && $.effects[showAnim])
+ inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+ else
+ inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
+ if (!showAnim || !duration)
+ postProcess();
+ if (inst.input.is(':visible') && !inst.input.is(':disabled'))
+ inst.input.focus();
+ $.datepicker._curInst = inst;
+ }
+ },
+
+ /* Generate the date picker content. */
+ _updateDatepicker: function(inst) {
+ var self = this;
+ var borders = $.datepicker._getBorders(inst.dpDiv);
+ inst.dpDiv.empty().append(this._generateHTML(inst));
+ var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+ if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
+ cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
+ }
+ inst.dpDiv.find('button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a')
+ .bind('mouseout', function(){
+ $(this).removeClass('ui-state-hover');
+ if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
+ if(this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
+ })
+ .bind('mouseover', function(){
+ if (!self._isDisabledDatepicker( inst.inline ? inst.dpDiv.parent()[0] : inst.input[0])) {
+ $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
+ $(this).addClass('ui-state-hover');
+ if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
+ if(this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
+ }
+ })
+ .end()
+ .find('.' + this._dayOverClass + ' a')
+ .trigger('mouseover')
+ .end();
+ var numMonths = this._getNumberOfMonths(inst);
+ var cols = numMonths[1];
+ var width = 17;
+ if (cols > 1)
+ inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
+ else
+ inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
+ inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
+ 'Class']('ui-datepicker-multi');
+ inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
+ 'Class']('ui-datepicker-rtl');
+ if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
+ // #6694 - don't focus the input if it's already focused
+ // this breaks the change event in IE
+ inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
+ inst.input.focus();
+ // deffered render of the years select (to avoid flashes on Firefox)
+ if( inst.yearshtml ){
+ var origyearshtml = inst.yearshtml;
+ setTimeout(function(){
+ //assure that inst.yearshtml didn't change.
+ if( origyearshtml === inst.yearshtml ){
+ inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
+ }
+ origyearshtml = inst.yearshtml = null;
+ }, 0);
+ }
+ },
+
+ /* Retrieve the size of left and top borders for an element.
+ @param elem (jQuery object) the element of interest
+ @return (number[2]) the left and top borders */
+ _getBorders: function(elem) {
+ var convert = function(value) {
+ return {thin: 1, medium: 2, thick: 3}[value] || value;
+ };
+ return [parseFloat(convert(elem.css('border-left-width'))),
+ parseFloat(convert(elem.css('border-top-width')))];
+ },
+
+ /* Check positioning to remain on screen. */
+ _checkOffset: function(inst, offset, isFixed) {
+ var dpWidth = inst.dpDiv.outerWidth();
+ var dpHeight = inst.dpDiv.outerHeight();
+ var inputWidth = inst.input ? inst.input.outerWidth() : 0;
+ var inputHeight = inst.input ? inst.input.outerHeight() : 0;
+ var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
+ var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
+
+ offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
+ offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
+ offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
+
+ // now check if datepicker is showing outside window viewport - move to a better place if so.
+ offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
+ Math.abs(offset.left + dpWidth - viewWidth) : 0);
+ offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
+ Math.abs(dpHeight + inputHeight) : 0);
+
+ return offset;
+ },
+
+ /* Find an object's position on the screen. */
+ _findPos: function(obj) {
+ var inst = this._getInst(obj);
+ var isRTL = this._get(inst, 'isRTL');
+ while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
+ obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+ }
+ var position = $(obj).offset();
+ return [position.left, position.top];
+ },
+
+ /* Hide the date picker from view.
+ @param input element - the input field attached to the date picker */
+ _hideDatepicker: function(input) {
+ var inst = this._curInst;
+ if (!inst || (input && inst != $.data(input, PROP_NAME)))
+ return;
+ if (this._datepickerShowing) {
+ var showAnim = this._get(inst, 'showAnim');
+ var duration = this._get(inst, 'duration');
+ var postProcess = function() {
+ $.datepicker._tidyDialog(inst);
+ this._curInst = null;
+ };
+ if ($.effects && $.effects[showAnim])
+ inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+ else
+ inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
+ (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
+ if (!showAnim)
+ postProcess();
+ var onClose = this._get(inst, 'onClose');
+ if (onClose)
+ onClose.apply((inst.input ? inst.input[0] : null),
+ [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback
+ this._datepickerShowing = false;
+ this._lastInput = null;
+ if (this._inDialog) {
+ this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
+ if ($.blockUI) {
+ $.unblockUI();
+ $('body').append(this.dpDiv);
+ }
+ }
+ this._inDialog = false;
+ }
+ },
+
+ /* Tidy up after a dialog display. */
+ _tidyDialog: function(inst) {
+ inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
+ },
+
+ /* Close date picker if clicked elsewhere. */
+ _checkExternalClick: function(event) {
+ if (!$.datepicker._curInst)
+ return;
+ var $target = $(event.target);
+ if ($target[0].id != $.datepicker._mainDivId &&
+ $target.parents('#' + $.datepicker._mainDivId).length == 0 &&
+ !$target.hasClass($.datepicker.markerClassName) &&
+ !$target.hasClass($.datepicker._triggerClass) &&
+ $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
+ $.datepicker._hideDatepicker();
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustDate: function(id, offset, period) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (this._isDisabledDatepicker(target[0])) {
+ return;
+ }
+ this._adjustInstDate(inst, offset +
+ (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
+ period);
+ this._updateDatepicker(inst);
+ },
+
+ /* Action for current link. */
+ _gotoToday: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
+ inst.selectedDay = inst.currentDay;
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+ inst.drawYear = inst.selectedYear = inst.currentYear;
+ }
+ else {
+ var date = new Date();
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ }
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Action for selecting a new month/year. */
+ _selectMonthYear: function(id, select, period) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ inst._selectingMonthYear = false;
+ inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
+ inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
+ parseInt(select.options[select.selectedIndex].value,10);
+ this._notifyChange(inst);
+ this._adjustDate(target);
+ },
+
+ /* Restore input focus after not changing month/year. */
+ _clickMonthYear: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ if (inst.input && inst._selectingMonthYear) {
+ setTimeout(function() {
+ inst.input.focus();
+ }, 0);
+ }
+ inst._selectingMonthYear = !inst._selectingMonthYear;
+ },
+
+ /* Action for selecting a day. */
+ _selectDay: function(id, month, year, td) {
+ var target = $(id);
+ if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
+ return;
+ }
+ var inst = this._getInst(target[0]);
+ inst.selectedDay = inst.currentDay = $('a', td).html();
+ inst.selectedMonth = inst.currentMonth = month;
+ inst.selectedYear = inst.currentYear = year;
+ this._selectDate(id, this._formatDate(inst,
+ inst.currentDay, inst.currentMonth, inst.currentYear));
+ },
+
+ /* Erase the input field and hide the date picker. */
+ _clearDate: function(id) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ this._selectDate(target, '');
+ },
+
+ /* Update the input field with the selected date. */
+ _selectDate: function(id, dateStr) {
+ var target = $(id);
+ var inst = this._getInst(target[0]);
+ dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+ if (inst.input)
+ inst.input.val(dateStr);
+ this._updateAlternate(inst);
+ var onSelect = this._get(inst, 'onSelect');
+ if (onSelect)
+ onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback
+ else if (inst.input)
+ inst.input.trigger('change'); // fire the change event
+ if (inst.inline)
+ this._updateDatepicker(inst);
+ else {
+ this._hideDatepicker();
+ this._lastInput = inst.input[0];
+ if (typeof(inst.input[0]) != 'object')
+ inst.input.focus(); // restore focus
+ this._lastInput = null;
+ }
+ },
+
+ /* Update any alternate field to synchronise with the main field. */
+ _updateAlternate: function(inst) {
+ var altField = this._get(inst, 'altField');
+ if (altField) { // update alternate field too
+ var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
+ var date = this._getDate(inst);
+ var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
+ $(altField).each(function() { $(this).val(dateStr); });
+ }
+ },
+
+ /* Set as beforeShowDay function to prevent selection of weekends.
+ @param date Date - the date to customise
+ @return [boolean, string] - is this date selectable?, what is its CSS class? */
+ noWeekends: function(date) {
+ var day = date.getDay();
+ return [(day > 0 && day < 6), ''];
+ },
+
+ /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+ @param date Date - the date to get the week for
+ @return number - the number of the week within the year that contains this date */
+ iso8601Week: function(date) {
+ var checkDate = new Date(date.getTime());
+ // Find Thursday of this week starting on Monday
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+ var time = checkDate.getTime();
+ checkDate.setMonth(0); // Compare with Jan 1
+ checkDate.setDate(1);
+ return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+ },
+
+ /* Parse a string value into a date object.
+ See formatDate below for the possible formats.
+
+ @param format string - the expected format of the date
+ @param value string - the date in the above format
+ @param settings Object - attributes include:
+ shortYearCutoff number - the cutoff year for determining the century (optional)
+ dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ dayNames string[7] - names of the days from Sunday (optional)
+ monthNamesShort string[12] - abbreviated names of the months (optional)
+ monthNames string[12] - names of the months (optional)
+ @return Date - the extracted date value or null if value is blank */
+ parseDate: function (format, value, settings) {
+ if (format == null || value == null)
+ throw 'Invalid arguments';
+ value = (typeof value == 'object' ? value.toString() : value + '');
+ if (value == '')
+ return null;
+ var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
+ shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+ var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+ var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+ var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+ var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+ var year = -1;
+ var month = -1;
+ var day = -1;
+ var doy = -1;
+ var literal = false;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ // Extract a number from the string value
+ var getNumber = function(match) {
+ var isDoubled = lookAhead(match);
+ var size = (match == '@' ? 14 : (match == '!' ? 20 :
+ (match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
+ var digits = new RegExp('^\\d{1,' + size + '}');
+ var num = value.substring(iValue).match(digits);
+ if (!num)
+ throw 'Missing number at position ' + iValue;
+ iValue += num[0].length;
+ return parseInt(num[0], 10);
+ };
+ // Extract a name from the string value and convert to an index
+ var getName = function(match, shortNames, longNames) {
+ var names = (lookAhead(match) ? longNames : shortNames);
+ for (var i = 0; i < names.length; i++) {
+ if (value.substr(iValue, names[i].length).toLowerCase() == names[i].toLowerCase()) {
+ iValue += names[i].length;
+ return i + 1;
+ }
+ }
+ throw 'Unknown name at position ' + iValue;
+ };
+ // Confirm that a literal character matches the string value
+ var checkLiteral = function() {
+ if (value.charAt(iValue) != format.charAt(iFormat))
+ throw 'Unexpected literal at position ' + iValue;
+ iValue++;
+ };
+ var iValue = 0;
+ for (var iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ checkLiteral();
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd':
+ day = getNumber('d');
+ break;
+ case 'D':
+ getName('D', dayNamesShort, dayNames);
+ break;
+ case 'o':
+ doy = getNumber('o');
+ break;
+ case 'm':
+ month = getNumber('m');
+ break;
+ case 'M':
+ month = getName('M', monthNamesShort, monthNames);
+ break;
+ case 'y':
+ year = getNumber('y');
+ break;
+ case '@':
+ var date = new Date(getNumber('@'));
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case '!':
+ var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
+ year = date.getFullYear();
+ month = date.getMonth() + 1;
+ day = date.getDate();
+ break;
+ case "'":
+ if (lookAhead("'"))
+ checkLiteral();
+ else
+ literal = true;
+ break;
+ default:
+ checkLiteral();
+ }
+ }
+ if (year == -1)
+ year = new Date().getFullYear();
+ else if (year < 100)
+ year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+ (year <= shortYearCutoff ? 0 : -100);
+ if (doy > -1) {
+ month = 1;
+ day = doy;
+ do {
+ var dim = this._getDaysInMonth(year, month - 1);
+ if (day <= dim)
+ break;
+ month++;
+ day -= dim;
+ } while (true);
+ }
+ var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
+ if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
+ throw 'Invalid date'; // E.g. 31/02/*
+ return date;
+ },
+
+ /* Standard date formats. */
+ ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
+ COOKIE: 'D, dd M yy',
+ ISO_8601: 'yy-mm-dd',
+ RFC_822: 'D, d M y',
+ RFC_850: 'DD, dd-M-y',
+ RFC_1036: 'D, d M y',
+ RFC_1123: 'D, d M yy',
+ RFC_2822: 'D, d M yy',
+ RSS: 'D, d M y', // RFC 822
+ TICKS: '!',
+ TIMESTAMP: '@',
+ W3C: 'yy-mm-dd', // ISO 8601
+
+ _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
+ Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
+
+ /* Format a date object into a string value.
+ The format can be combinations of the following:
+ d - day of month (no leading zero)
+ dd - day of month (two digit)
+ o - day of year (no leading zeros)
+ oo - day of year (three digit)
+ D - day name short
+ DD - day name long
+ m - month of year (no leading zero)
+ mm - month of year (two digit)
+ M - month name short
+ MM - month name long
+ y - year (two digit)
+ yy - year (four digit)
+ @ - Unix timestamp (ms since 01/01/1970)
+ ! - Windows ticks (100ns since 01/01/0001)
+ '...' - literal text
+ '' - single quote
+
+ @param format string - the desired format of the date
+ @param date Date - the date value to format
+ @param settings Object - attributes include:
+ dayNamesShort string[7] - abbreviated names of the days from Sunday (optional)
+ dayNames string[7] - names of the days from Sunday (optional)
+ monthNamesShort string[12] - abbreviated names of the months (optional)
+ monthNames string[12] - names of the months (optional)
+ @return string - the date in the above format */
+ formatDate: function (format, date, settings) {
+ if (!date)
+ return '';
+ var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+ var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+ var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+ var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ // Format a number, with leading zero if necessary
+ var formatNumber = function(match, value, len) {
+ var num = '' + value;
+ if (lookAhead(match))
+ while (num.length < len)
+ num = '0' + num;
+ return num;
+ };
+ // Format a name, short or long as requested
+ var formatName = function(match, value, shortNames, longNames) {
+ return (lookAhead(match) ? longNames[value] : shortNames[value]);
+ };
+ var output = '';
+ var literal = false;
+ if (date)
+ for (var iFormat = 0; iFormat < format.length; iFormat++) {
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ output += format.charAt(iFormat);
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd':
+ output += formatNumber('d', date.getDate(), 2);
+ break;
+ case 'D':
+ output += formatName('D', date.getDay(), dayNamesShort, dayNames);
+ break;
+ case 'o':
+ output += formatNumber('o',
+ (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3);
+ break;
+ case 'm':
+ output += formatNumber('m', date.getMonth() + 1, 2);
+ break;
+ case 'M':
+ output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
+ break;
+ case 'y':
+ output += (lookAhead('y') ? date.getFullYear() :
+ (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
+ break;
+ case '@':
+ output += date.getTime();
+ break;
+ case '!':
+ output += date.getTime() * 10000 + this._ticksTo1970;
+ break;
+ case "'":
+ if (lookAhead("'"))
+ output += "'";
+ else
+ literal = true;
+ break;
+ default:
+ output += format.charAt(iFormat);
+ }
+ }
+ return output;
+ },
+
+ /* Extract all possible characters from the date format. */
+ _possibleChars: function (format) {
+ var chars = '';
+ var literal = false;
+ // Check whether a format character is doubled
+ var lookAhead = function(match) {
+ var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+ if (matches)
+ iFormat++;
+ return matches;
+ };
+ for (var iFormat = 0; iFormat < format.length; iFormat++)
+ if (literal)
+ if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+ literal = false;
+ else
+ chars += format.charAt(iFormat);
+ else
+ switch (format.charAt(iFormat)) {
+ case 'd': case 'm': case 'y': case '@':
+ chars += '0123456789';
+ break;
+ case 'D': case 'M':
+ return null; // Accept anything
+ case "'":
+ if (lookAhead("'"))
+ chars += "'";
+ else
+ literal = true;
+ break;
+ default:
+ chars += format.charAt(iFormat);
+ }
+ return chars;
+ },
+
+ /* Get a setting value, defaulting if necessary. */
+ _get: function(inst, name) {
+ return inst.settings[name] !== undefined ?
+ inst.settings[name] : this._defaults[name];
+ },
+
+ /* Parse existing date and initialise date picker. */
+ _setDateFromField: function(inst, noDefault) {
+ if (inst.input.val() == inst.lastVal) {
+ return;
+ }
+ var dateFormat = this._get(inst, 'dateFormat');
+ var dates = inst.lastVal = inst.input ? inst.input.val() : null;
+ var date, defaultDate;
+ date = defaultDate = this._getDefaultDate(inst);
+ var settings = this._getFormatConfig(inst);
+ try {
+ date = this.parseDate(dateFormat, dates, settings) || defaultDate;
+ } catch (event) {
+ this.log(event);
+ dates = (noDefault ? '' : dates);
+ }
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ inst.currentDay = (dates ? date.getDate() : 0);
+ inst.currentMonth = (dates ? date.getMonth() : 0);
+ inst.currentYear = (dates ? date.getFullYear() : 0);
+ this._adjustInstDate(inst);
+ },
+
+ /* Retrieve the default date shown on opening. */
+ _getDefaultDate: function(inst) {
+ return this._restrictMinMax(inst,
+ this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
+ },
+
+ /* A date may be specified as an exact value or a relative one. */
+ _determineDate: function(inst, date, defaultDate) {
+ var offsetNumeric = function(offset) {
+ var date = new Date();
+ date.setDate(date.getDate() + offset);
+ return date;
+ };
+ var offsetString = function(offset) {
+ try {
+ return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+ offset, $.datepicker._getFormatConfig(inst));
+ }
+ catch (e) {
+ // Ignore
+ }
+ var date = (offset.toLowerCase().match(/^c/) ?
+ $.datepicker._getDate(inst) : null) || new Date();
+ var year = date.getFullYear();
+ var month = date.getMonth();
+ var day = date.getDate();
+ var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
+ var matches = pattern.exec(offset);
+ while (matches) {
+ switch (matches[2] || 'd') {
+ case 'd' : case 'D' :
+ day += parseInt(matches[1],10); break;
+ case 'w' : case 'W' :
+ day += parseInt(matches[1],10) * 7; break;
+ case 'm' : case 'M' :
+ month += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ case 'y': case 'Y' :
+ year += parseInt(matches[1],10);
+ day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+ break;
+ }
+ matches = pattern.exec(offset);
+ }
+ return new Date(year, month, day);
+ };
+ var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
+ (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
+ newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
+ if (newDate) {
+ newDate.setHours(0);
+ newDate.setMinutes(0);
+ newDate.setSeconds(0);
+ newDate.setMilliseconds(0);
+ }
+ return this._daylightSavingAdjust(newDate);
+ },
+
+ /* Handle switch to/from daylight saving.
+ Hours may be non-zero on daylight saving cut-over:
+ > 12 when midnight changeover, but then cannot generate
+ midnight datetime, so jump to 1AM, otherwise reset.
+ @param date (Date) the date to check
+ @return (Date) the corrected date */
+ _daylightSavingAdjust: function(date) {
+ if (!date) return null;
+ date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
+ return date;
+ },
+
+ /* Set the date(s) directly. */
+ _setDate: function(inst, date, noChange) {
+ var clear = !date;
+ var origMonth = inst.selectedMonth;
+ var origYear = inst.selectedYear;
+ var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
+ inst.selectedDay = inst.currentDay = newDate.getDate();
+ inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+ inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
+ if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
+ this._notifyChange(inst);
+ this._adjustInstDate(inst);
+ if (inst.input) {
+ inst.input.val(clear ? '' : this._formatDate(inst));
+ }
+ },
+
+ /* Retrieve the date(s) directly. */
+ _getDate: function(inst) {
+ var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
+ this._daylightSavingAdjust(new Date(
+ inst.currentYear, inst.currentMonth, inst.currentDay)));
+ return startDate;
+ },
+
+ /* Generate the HTML for the current state of the date picker. */
+ _generateHTML: function(inst) {
+ var today = new Date();
+ today = this._daylightSavingAdjust(
+ new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
+ var isRTL = this._get(inst, 'isRTL');
+ var showButtonPanel = this._get(inst, 'showButtonPanel');
+ var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
+ var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
+ var numMonths = this._getNumberOfMonths(inst);
+ var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
+ var stepMonths = this._get(inst, 'stepMonths');
+ var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
+ var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
+ new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ var drawMonth = inst.drawMonth - showCurrentAtPos;
+ var drawYear = inst.drawYear;
+ if (drawMonth < 0) {
+ drawMonth += 12;
+ drawYear--;
+ }
+ if (maxDate) {
+ var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
+ maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
+ maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
+ while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
+ drawMonth--;
+ if (drawMonth < 0) {
+ drawMonth = 11;
+ drawYear--;
+ }
+ }
+ }
+ inst.drawMonth = drawMonth;
+ inst.drawYear = drawYear;
+ var prevText = this._get(inst, 'prevText');
+ prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
+ this._getFormatConfig(inst)));
+ var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
+ '<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
+ ' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
+ (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
+ var nextText = this._get(inst, 'nextText');
+ nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
+ this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
+ this._getFormatConfig(inst)));
+ var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
+ '<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
+ ' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
+ (hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
+ var currentText = this._get(inst, 'currentText');
+ var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
+ currentText = (!navigationAsDateFormat ? currentText :
+ this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
+ var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : '');
+ var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
+ (this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+ '.datepicker._gotoToday(\'#' + inst.id + '\');"' +
+ '>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
+ var firstDay = parseInt(this._get(inst, 'firstDay'),10);
+ firstDay = (isNaN(firstDay) ? 0 : firstDay);
+ var showWeek = this._get(inst, 'showWeek');
+ var dayNames = this._get(inst, 'dayNames');
+ var dayNamesShort = this._get(inst, 'dayNamesShort');
+ var dayNamesMin = this._get(inst, 'dayNamesMin');
+ var monthNames = this._get(inst, 'monthNames');
+ var monthNamesShort = this._get(inst, 'monthNamesShort');
+ var beforeShowDay = this._get(inst, 'beforeShowDay');
+ var showOtherMonths = this._get(inst, 'showOtherMonths');
+ var selectOtherMonths = this._get(inst, 'selectOtherMonths');
+ var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
+ var defaultDate = this._getDefaultDate(inst);
+ var html = '';
+ for (var row = 0; row < numMonths[0]; row++) {
+ var group = '';
+ for (var col = 0; col < numMonths[1]; col++) {
+ var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
+ var cornerClass = ' ui-corner-all';
+ var calender = '';
+ if (isMultiMonth) {
+ calender += '<div class="ui-datepicker-group';
+ if (numMonths[1] > 1)
+ switch (col) {
+ case 0: calender += ' ui-datepicker-group-first';
+ cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
+ case numMonths[1]-1: calender += ' ui-datepicker-group-last';
+ cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
+ default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
+ }
+ calender += '">';
+ }
+ calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
+ (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
+ (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
+ this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
+ row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
+ '</div><table class="ui-datepicker-calendar"><thead>' +
+ '<tr>';
+ var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
+ for (var dow = 0; dow < 7; dow++) { // days of the week
+ var day = (dow + firstDay) % 7;
+ thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
+ '<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
+ }
+ calender += thead + '</tr></thead><tbody>';
+ var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
+ if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
+ inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
+ var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
+ var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate
+ var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
+ for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
+ calender += '<tr>';
+ var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
+ this._get(inst, 'calculateWeek')(printDate) + '</td>');
+ for (var dow = 0; dow < 7; dow++) { // create date picker days
+ var daySettings = (beforeShowDay ?
+ beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
+ var otherMonth = (printDate.getMonth() != drawMonth);
+ var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
+ (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
+ tbody += '<td class="' +
+ ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
+ (otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
+ ((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
+ (defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
+ // or defaultDate is current printedDate and defaultDate is selectedDate
+ ' ' + this._dayOverClass : '') + // highlight selected day
+ (unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') + // highlight unselectable days
+ (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
+ (printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
+ (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
+ ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
+ (unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
+ inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions
+ (otherMonth && !showOtherMonths ? ' ' : // display for other months
+ (unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
+ (printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
+ (printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
+ (otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
+ '" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
+ printDate.setDate(printDate.getDate() + 1);
+ printDate = this._daylightSavingAdjust(printDate);
+ }
+ calender += tbody + '</tr>';
+ }
+ drawMonth++;
+ if (drawMonth > 11) {
+ drawMonth = 0;
+ drawYear++;
+ }
+ calender += '</tbody></table>' + (isMultiMonth ? '</div>' +
+ ((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
+ group += calender;
+ }
+ html += group;
+ }
+ html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+ '<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
+ inst._keyEvent = false;
+ return html;
+ },
+
+ /* Generate the month and year header. */
+ _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
+ secondary, monthNames, monthNamesShort) {
+ var changeMonth = this._get(inst, 'changeMonth');
+ var changeYear = this._get(inst, 'changeYear');
+ var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
+ var html = '<div class="ui-datepicker-title">';
+ var monthHtml = '';
+ // month selection
+ if (secondary || !changeMonth)
+ monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
+ else {
+ var inMinYear = (minDate && minDate.getFullYear() == drawYear);
+ var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
+ monthHtml += '<select class="ui-datepicker-month" ' +
+ 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
+ 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
+ '>';
+ for (var month = 0; month < 12; month++) {
+ if ((!inMinYear || month >= minDate.getMonth()) &&
+ (!inMaxYear || month <= maxDate.getMonth()))
+ monthHtml += '<option value="' + month + '"' +
+ (month == drawMonth ? ' selected="selected"' : '') +
+ '>' + monthNamesShort[month] + '</option>';
+ }
+ monthHtml += '</select>';
+ }
+ if (!showMonthAfterYear)
+ html += monthHtml + (secondary || !(changeMonth && changeYear) ? ' ' : '');
+ // year selection
+ inst.yearshtml = '';
+ if (secondary || !changeYear)
+ html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
+ else {
+ // determine range of years to display
+ var years = this._get(inst, 'yearRange').split(':');
+ var thisYear = new Date().getFullYear();
+ var determineYear = function(value) {
+ var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
+ (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
+ parseInt(value, 10)));
+ return (isNaN(year) ? thisYear : year);
+ };
+ var year = determineYear(years[0]);
+ var endYear = Math.max(year, determineYear(years[1] || ''));
+ year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
+ endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
+ inst.yearshtml += '<select class="ui-datepicker-year" ' +
+ 'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
+ 'onclick="DP_jQuery_' + dpuuid + '.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
+ '>';
+ for (; year <= endYear; year++) {
+ inst.yearshtml += '<option value="' + year + '"' +
+ (year == drawYear ? ' selected="selected"' : '') +
+ '>' + year + '</option>';
+ }
+ inst.yearshtml += '</select>';
+ //when showing there is no need for later update
+ if( ! $.browser.mozilla ){
+ html += inst.yearshtml;
+ inst.yearshtml = null;
+ } else {
+ // will be replaced later with inst.yearshtml
+ html += '<select class="ui-datepicker-year"><option value="' + drawYear + '" selected="selected">' + drawYear + '</option></select>';
+ }
+ }
+ html += this._get(inst, 'yearSuffix');
+ if (showMonthAfterYear)
+ html += (secondary || !(changeMonth && changeYear) ? ' ' : '') + monthHtml;
+ html += '</div>'; // Close datepicker_header
+ return html;
+ },
+
+ /* Adjust one of the date sub-fields. */
+ _adjustInstDate: function(inst, offset, period) {
+ var year = inst.drawYear + (period == 'Y' ? offset : 0);
+ var month = inst.drawMonth + (period == 'M' ? offset : 0);
+ var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
+ (period == 'D' ? offset : 0);
+ var date = this._restrictMinMax(inst,
+ this._daylightSavingAdjust(new Date(year, month, day)));
+ inst.selectedDay = date.getDate();
+ inst.drawMonth = inst.selectedMonth = date.getMonth();
+ inst.drawYear = inst.selectedYear = date.getFullYear();
+ if (period == 'M' || period == 'Y')
+ this._notifyChange(inst);
+ },
+
+ /* Ensure a date is within any min/max bounds. */
+ _restrictMinMax: function(inst, date) {
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ var newDate = (minDate && date < minDate ? minDate : date);
+ newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
+ return newDate;
+ },
+
+ /* Notify change of month/year. */
+ _notifyChange: function(inst) {
+ var onChange = this._get(inst, 'onChangeMonthYear');
+ if (onChange)
+ onChange.apply((inst.input ? inst.input[0] : null),
+ [inst.selectedYear, inst.selectedMonth + 1, inst]);
+ },
+
+ /* Determine the number of months to show. */
+ _getNumberOfMonths: function(inst) {
+ var numMonths = this._get(inst, 'numberOfMonths');
+ return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
+ },
+
+ /* Determine the current maximum date - ensure no time components are set. */
+ _getMinMaxDate: function(inst, minMax) {
+ return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
+ },
+
+ /* Find the number of days in a given month. */
+ _getDaysInMonth: function(year, month) {
+ return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
+ },
+
+ /* Find the day of the week of the first of a month. */
+ _getFirstDayOfMonth: function(year, month) {
+ return new Date(year, month, 1).getDay();
+ },
+
+ /* Determines if we should allow a "next/prev" month display change. */
+ _canAdjustMonth: function(inst, offset, curYear, curMonth) {
+ var numMonths = this._getNumberOfMonths(inst);
+ var date = this._daylightSavingAdjust(new Date(curYear,
+ curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
+ if (offset < 0)
+ date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
+ return this._isInRange(inst, date);
+ },
+
+ /* Is the given date in the accepted range? */
+ _isInRange: function(inst, date) {
+ var minDate = this._getMinMaxDate(inst, 'min');
+ var maxDate = this._getMinMaxDate(inst, 'max');
+ return ((!minDate || date.getTime() >= minDate.getTime()) &&
+ (!maxDate || date.getTime() <= maxDate.getTime()));
+ },
+
+ /* Provide the configuration settings for formatting/parsing. */
+ _getFormatConfig: function(inst) {
+ var shortYearCutoff = this._get(inst, 'shortYearCutoff');
+ shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+ new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+ return {shortYearCutoff: shortYearCutoff,
+ dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
+ monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
+ },
+
+ /* Format the given date for display. */
+ _formatDate: function(inst, day, month, year) {
+ if (!day) {
+ inst.currentDay = inst.selectedDay;
+ inst.currentMonth = inst.selectedMonth;
+ inst.currentYear = inst.selectedYear;
+ }
+ var date = (day ? (typeof day == 'object' ? day :
+ this._daylightSavingAdjust(new Date(year, month, day))) :
+ this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+ return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
+ }
+});
+
+/* jQuery extend now ignores nulls! */
+function extendRemove(target, props) {
+ $.extend(target, props);
+ for (var name in props)
+ if (props[name] == null || props[name] == undefined)
+ target[name] = props[name];
+ return target;
+};
+
+/* Determine whether an object is an array. */
+function isArray(a) {
+ return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
+ (a.constructor && a.constructor.toString().match(/\Array\(\)/))));
+};
+
+/* Invoke the datepicker functionality.
+ @param options string - a command, optionally followed by additional parameters or
+ Object - settings for attaching new datepicker functionality
+ @return jQuery object */
+$.fn.datepicker = function(options){
+
+ /* Verify an empty collection wasn't passed - Fixes #6976 */
+ if ( !this.length ) {
+ return this;
+ }
+
+ /* Initialise the date picker. */
+ if (!$.datepicker.initialized) {
+ $(document).mousedown($.datepicker._checkExternalClick).
+ find('body').append($.datepicker.dpDiv);
+ $.datepicker.initialized = true;
+ }
+
+ var otherArgs = Array.prototype.slice.call(arguments, 1);
+ if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
+ return $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
+ return $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this[0]].concat(otherArgs));
+ return this.each(function() {
+ typeof options == 'string' ?
+ $.datepicker['_' + options + 'Datepicker'].
+ apply($.datepicker, [this].concat(otherArgs)) :
+ $.datepicker._attachDatepicker(this, options);
+ });
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.8.10";
+
+// Workaround for #4055
+// Add another global to avoid noConflict issues with inline event handlers
+window['DP_jQuery_' + dpuuid] = $;
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Dialog 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.button.js
+ * jquery.ui.draggable.js
+ * jquery.ui.mouse.js
+ * jquery.ui.position.js
+ * jquery.ui.resizable.js
+ */
+(function( $, undefined ) {
+
+var uiDialogClasses =
+ 'ui-dialog ' +
+ 'ui-widget ' +
+ 'ui-widget-content ' +
+ 'ui-corner-all ',
+ sizeRelatedOptions = {
+ buttons: true,
+ height: true,
+ maxHeight: true,
+ maxWidth: true,
+ minHeight: true,
+ minWidth: true,
+ width: true
+ },
+ resizableRelatedOptions = {
+ maxHeight: true,
+ maxWidth: true,
+ minHeight: true,
+ minWidth: true
+ };
+
+$.widget("ui.dialog", {
+ options: {
+ autoOpen: true,
+ buttons: {},
+ closeOnEscape: true,
+ closeText: 'close',
+ dialogClass: '',
+ draggable: true,
+ hide: null,
+ height: 'auto',
+ maxHeight: false,
+ maxWidth: false,
+ minHeight: 150,
+ minWidth: 150,
+ modal: false,
+ position: {
+ my: 'center',
+ at: 'center',
+ collision: 'fit',
+ // ensure that the titlebar is never outside the document
+ using: function(pos) {
+ var topOffset = $(this).css(pos).offset().top;
+ if (topOffset < 0) {
+ $(this).css('top', pos.top - topOffset);
+ }
+ }
+ },
+ resizable: true,
+ show: null,
+ stack: true,
+ title: '',
+ width: 300,
+ zIndex: 1000
+ },
+
+ _create: function() {
+ this.originalTitle = this.element.attr('title');
+ // #5742 - .attr() might return a DOMElement
+ if ( typeof this.originalTitle !== "string" ) {
+ this.originalTitle = "";
+ }
+
+ this.options.title = this.options.title || this.originalTitle;
+ var self = this,
+ options = self.options,
+
+ title = options.title || ' ',
+ titleId = $.ui.dialog.getTitleId(self.element),
+
+ uiDialog = (self.uiDialog = $('<div></div>'))
+ .appendTo(document.body)
+ .hide()
+ .addClass(uiDialogClasses + options.dialogClass)
+ .css({
+ zIndex: options.zIndex
+ })
+ // setting tabIndex makes the div focusable
+ // setting outline to 0 prevents a border on focus in Mozilla
+ .attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
+ if (options.closeOnEscape && event.keyCode &&
+ event.keyCode === $.ui.keyCode.ESCAPE) {
+
+ self.close(event);
+ event.preventDefault();
+ }
+ })
+ .attr({
+ role: 'dialog',
+ 'aria-labelledby': titleId
+ })
+ .mousedown(function(event) {
+ self.moveToTop(false, event);
+ }),
+
+ uiDialogContent = self.element
+ .show()
+ .removeAttr('title')
+ .addClass(
+ 'ui-dialog-content ' +
+ 'ui-widget-content')
+ .appendTo(uiDialog),
+
+ uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
+ .addClass(
+ 'ui-dialog-titlebar ' +
+ 'ui-widget-header ' +
+ 'ui-corner-all ' +
+ 'ui-helper-clearfix'
+ )
+ .prependTo(uiDialog),
+
+ uiDialogTitlebarClose = $('<a href="#"></a>')
+ .addClass(
+ 'ui-dialog-titlebar-close ' +
+ 'ui-corner-all'
+ )
+ .attr('role', 'button')
+ .hover(
+ function() {
+ uiDialogTitlebarClose.addClass('ui-state-hover');
+ },
+ function() {
+ uiDialogTitlebarClose.removeClass('ui-state-hover');
+ }
+ )
+ .focus(function() {
+ uiDialogTitlebarClose.addClass('ui-state-focus');
+ })
+ .blur(function() {
+ uiDialogTitlebarClose.removeClass('ui-state-focus');
+ })
+ .click(function(event) {
+ self.close(event);
+ return false;
+ })
+ .appendTo(uiDialogTitlebar),
+
+ uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
+ .addClass(
+ 'ui-icon ' +
+ 'ui-icon-closethick'
+ )
+ .text(options.closeText)
+ .appendTo(uiDialogTitlebarClose),
+
+ uiDialogTitle = $('<span></span>')
+ .addClass('ui-dialog-title')
+ .attr('id', titleId)
+ .html(title)
+ .prependTo(uiDialogTitlebar);
+
+ //handling of deprecated beforeclose (vs beforeClose) option
+ //Ticket #4669 http://dev.jqueryui.com/ticket/4669
+ //TODO: remove in 1.9pre
+ if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
+ options.beforeClose = options.beforeclose;
+ }
+
+ uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
+
+ if (options.draggable && $.fn.draggable) {
+ self._makeDraggable();
+ }
+ if (options.resizable && $.fn.resizable) {
+ self._makeResizable();
+ }
+
+ self._createButtons(options.buttons);
+ self._isOpen = false;
+
+ if ($.fn.bgiframe) {
+ uiDialog.bgiframe();
+ }
+ },
+
+ _init: function() {
+ if ( this.options.autoOpen ) {
+ this.open();
+ }
+ },
+
+ destroy: function() {
+ var self = this;
+
+ if (self.overlay) {
+ self.overlay.destroy();
+ }
+ self.uiDialog.hide();
+ self.element
+ .unbind('.dialog')
+ .removeData('dialog')
+ .removeClass('ui-dialog-content ui-widget-content')
+ .hide().appendTo('body');
+ self.uiDialog.remove();
+
+ if (self.originalTitle) {
+ self.element.attr('title', self.originalTitle);
+ }
+
+ return self;
+ },
+
+ widget: function() {
+ return this.uiDialog;
+ },
+
+ close: function(event) {
+ var self = this,
+ maxZ, thisZ;
+
+ if (false === self._trigger('beforeClose', event)) {
+ return;
+ }
+
+ if (self.overlay) {
+ self.overlay.destroy();
+ }
+ self.uiDialog.unbind('keypress.ui-dialog');
+
+ self._isOpen = false;
+
+ if (self.options.hide) {
+ self.uiDialog.hide(self.options.hide, function() {
+ self._trigger('close', event);
+ });
+ } else {
+ self.uiDialog.hide();
+ self._trigger('close', event);
+ }
+
+ $.ui.dialog.overlay.resize();
+
+ // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+ if (self.options.modal) {
+ maxZ = 0;
+ $('.ui-dialog').each(function() {
+ if (this !== self.uiDialog[0]) {
+ thisZ = $(this).css('z-index');
+ if(!isNaN(thisZ)) {
+ maxZ = Math.max(maxZ, thisZ);
+ }
+ }
+ });
+ $.ui.dialog.maxZ = maxZ;
+ }
+
+ return self;
+ },
+
+ isOpen: function() {
+ return this._isOpen;
+ },
+
+ // the force parameter allows us to move modal dialogs to their correct
+ // position on open
+ moveToTop: function(force, event) {
+ var self = this,
+ options = self.options,
+ saveScroll;
+
+ if ((options.modal && !force) ||
+ (!options.stack && !options.modal)) {
+ return self._trigger('focus', event);
+ }
+
+ if (options.zIndex > $.ui.dialog.maxZ) {
+ $.ui.dialog.maxZ = options.zIndex;
+ }
+ if (self.overlay) {
+ $.ui.dialog.maxZ += 1;
+ self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
+ }
+
+ //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
+ // http://ui.jquery.com/bugs/ticket/3193
+ saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') };
+ $.ui.dialog.maxZ += 1;
+ self.uiDialog.css('z-index', $.ui.dialog.maxZ);
+ self.element.attr(saveScroll);
+ self._trigger('focus', event);
+
+ return self;
+ },
+
+ open: function() {
+ if (this._isOpen) { return; }
+
+ var self = this,
+ options = self.options,
+ uiDialog = self.uiDialog;
+
+ self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
+ self._size();
+ self._position(options.position);
+ uiDialog.show(options.show);
+ self.moveToTop(true);
+
+ // prevent tabbing out of modal dialogs
+ if (options.modal) {
+ uiDialog.bind('keypress.ui-dialog', function(event) {
+ if (event.keyCode !== $.ui.keyCode.TAB) {
+ return;
+ }
+
+ var tabbables = $(':tabbable', this),
+ first = tabbables.filter(':first'),
+ last = tabbables.filter(':last');
+
+ if (event.target === last[0] && !event.shiftKey) {
+ first.focus(1);
+ return false;
+ } else if (event.target === first[0] && event.shiftKey) {
+ last.focus(1);
+ return false;
+ }
+ });
+ }
+
+ // set focus to the first tabbable element in the content area or the first button
+ // if there are no tabbable elements, set focus on the dialog itself
+ $(self.element.find(':tabbable').get().concat(
+ uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
+ uiDialog.get()))).eq(0).focus();
+
+ self._isOpen = true;
+ self._trigger('open');
+
+ return self;
+ },
+
+ _createButtons: function(buttons) {
+ var self = this,
+ hasButtons = false,
+ uiDialogButtonPane = $('<div></div>')
+ .addClass(
+ 'ui-dialog-buttonpane ' +
+ 'ui-widget-content ' +
+ 'ui-helper-clearfix'
+ ),
+ uiButtonSet = $( "<div></div>" )
+ .addClass( "ui-dialog-buttonset" )
+ .appendTo( uiDialogButtonPane );
+
+ // if we already have a button pane, remove it
+ self.uiDialog.find('.ui-dialog-buttonpane').remove();
+
+ if (typeof buttons === 'object' && buttons !== null) {
+ $.each(buttons, function() {
+ return !(hasButtons = true);
+ });
+ }
+ if (hasButtons) {
+ $.each(buttons, function(name, props) {
+ props = $.isFunction( props ) ?
+ { click: props, text: name } :
+ props;
+ var button = $('<button type="button"></button>')
+ .attr( props, true )
+ .unbind('click')
+ .click(function() {
+ props.click.apply(self.element[0], arguments);
+ })
+ .appendTo(uiButtonSet);
+ if ($.fn.button) {
+ button.button();
+ }
+ });
+ uiDialogButtonPane.appendTo(self.uiDialog);
+ }
+ },
+
+ _makeDraggable: function() {
+ var self = this,
+ options = self.options,
+ doc = $(document),
+ heightBeforeDrag;
+
+ function filteredUi(ui) {
+ return {
+ position: ui.position,
+ offset: ui.offset
+ };
+ }
+
+ self.uiDialog.draggable({
+ cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
+ handle: '.ui-dialog-titlebar',
+ containment: 'document',
+ start: function(event, ui) {
+ heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
+ $(this).height($(this).height()).addClass("ui-dialog-dragging");
+ self._trigger('dragStart', event, filteredUi(ui));
+ },
+ drag: function(event, ui) {
+ self._trigger('drag', event, filteredUi(ui));
+ },
+ stop: function(event, ui) {
+ options.position = [ui.position.left - doc.scrollLeft(),
+ ui.position.top - doc.scrollTop()];
+ $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
+ self._trigger('dragStop', event, filteredUi(ui));
+ $.ui.dialog.overlay.resize();
+ }
+ });
+ },
+
+ _makeResizable: function(handles) {
+ handles = (handles === undefined ? this.options.resizable : handles);
+ var self = this,
+ options = self.options,
+ // .ui-resizable has position: relative defined in the stylesheet
+ // but dialogs have to use absolute or fixed positioning
+ position = self.uiDialog.css('position'),
+ resizeHandles = (typeof handles === 'string' ?
+ handles :
+ 'n,e,s,w,se,sw,ne,nw'
+ );
+
+ function filteredUi(ui) {
+ return {
+ originalPosition: ui.originalPosition,
+ originalSize: ui.originalSize,
+ position: ui.position,
+ size: ui.size
+ };
+ }
+
+ self.uiDialog.resizable({
+ cancel: '.ui-dialog-content',
+ containment: 'document',
+ alsoResize: self.element,
+ maxWidth: options.maxWidth,
+ maxHeight: options.maxHeight,
+ minWidth: options.minWidth,
+ minHeight: self._minHeight(),
+ handles: resizeHandles,
+ start: function(event, ui) {
+ $(this).addClass("ui-dialog-resizing");
+ self._trigger('resizeStart', event, filteredUi(ui));
+ },
+ resize: function(event, ui) {
+ self._trigger('resize', event, filteredUi(ui));
+ },
+ stop: function(event, ui) {
+ $(this).removeClass("ui-dialog-resizing");
+ options.height = $(this).height();
+ options.width = $(this).width();
+ self._trigger('resizeStop', event, filteredUi(ui));
+ $.ui.dialog.overlay.resize();
+ }
+ })
+ .css('position', position)
+ .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+ },
+
+ _minHeight: function() {
+ var options = this.options;
+
+ if (options.height === 'auto') {
+ return options.minHeight;
+ } else {
+ return Math.min(options.minHeight, options.height);
+ }
+ },
+
+ _position: function(position) {
+ var myAt = [],
+ offset = [0, 0],
+ isVisible;
+
+ if (position) {
+ // deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
+ // if (typeof position == 'string' || $.isArray(position)) {
+ // myAt = $.isArray(position) ? position : position.split(' ');
+
+ if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
+ myAt = position.split ? position.split(' ') : [position[0], position[1]];
+ if (myAt.length === 1) {
+ myAt[1] = myAt[0];
+ }
+
+ $.each(['left', 'top'], function(i, offsetPosition) {
+ if (+myAt[i] === myAt[i]) {
+ offset[i] = myAt[i];
+ myAt[i] = offsetPosition;
+ }
+ });
+
+ position = {
+ my: myAt.join(" "),
+ at: myAt.join(" "),
+ offset: offset.join(" ")
+ };
+ }
+
+ position = $.extend({}, $.ui.dialog.prototype.options.position, position);
+ } else {
+ position = $.ui.dialog.prototype.options.position;
+ }
+
+ // need to show the dialog to get the actual offset in the position plugin
+ isVisible = this.uiDialog.is(':visible');
+ if (!isVisible) {
+ this.uiDialog.show();
+ }
+ this.uiDialog
+ // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+ .css({ top: 0, left: 0 })
+ .position($.extend({ of: window }, position));
+ if (!isVisible) {
+ this.uiDialog.hide();
+ }
+ },
+
+ _setOptions: function( options ) {
+ var self = this,
+ resizableOptions = {},
+ resize = false;
+
+ $.each( options, function( key, value ) {
+ self._setOption( key, value );
+
+ if ( key in sizeRelatedOptions ) {
+ resize = true;
+ }
+ if ( key in resizableRelatedOptions ) {
+ resizableOptions[ key ] = value;
+ }
+ });
+
+ if ( resize ) {
+ this._size();
+ }
+ if ( this.uiDialog.is( ":data(resizable)" ) ) {
+ this.uiDialog.resizable( "option", resizableOptions );
+ }
+ },
+
+ _setOption: function(key, value){
+ var self = this,
+ uiDialog = self.uiDialog;
+
+ switch (key) {
+ //handling of deprecated beforeclose (vs beforeClose) option
+ //Ticket #4669 http://dev.jqueryui.com/ticket/4669
+ //TODO: remove in 1.9pre
+ case "beforeclose":
+ key = "beforeClose";
+ break;
+ case "buttons":
+ self._createButtons(value);
+ break;
+ case "closeText":
+ // ensure that we always pass a string
+ self.uiDialogTitlebarCloseText.text("" + value);
+ break;
+ case "dialogClass":
+ uiDialog
+ .removeClass(self.options.dialogClass)
+ .addClass(uiDialogClasses + value);
+ break;
+ case "disabled":
+ if (value) {
+ uiDialog.addClass('ui-dialog-disabled');
+ } else {
+ uiDialog.removeClass('ui-dialog-disabled');
+ }
+ break;
+ case "draggable":
+ var isDraggable = uiDialog.is( ":data(draggable)" );
+ if ( isDraggable && !value ) {
+ uiDialog.draggable( "destroy" );
+ }
+
+ if ( !isDraggable && value ) {
+ self._makeDraggable();
+ }
+ break;
+ case "position":
+ self._position(value);
+ break;
+ case "resizable":
+ // currently resizable, becoming non-resizable
+ var isResizable = uiDialog.is( ":data(resizable)" );
+ if (isResizable && !value) {
+ uiDialog.resizable('destroy');
+ }
+
+ // currently resizable, changing handles
+ if (isResizable && typeof value === 'string') {
+ uiDialog.resizable('option', 'handles', value);
+ }
+
+ // currently non-resizable, becoming resizable
+ if (!isResizable && value !== false) {
+ self._makeResizable(value);
+ }
+ break;
+ case "title":
+ // convert whatever was passed in o a string, for html() to not throw up
+ $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || ' '));
+ break;
+ }
+
+ $.Widget.prototype._setOption.apply(self, arguments);
+ },
+
+ _size: function() {
+ /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+ * divs will both have width and height set, so we need to reset them
+ */
+ var options = this.options,
+ nonContentHeight,
+ minContentHeight,
+ isVisible = this.uiDialog.is( ":visible" );
+
+ // reset content sizing
+ this.element.show().css({
+ width: 'auto',
+ minHeight: 0,
+ height: 0
+ });
+
+ if (options.minWidth > options.width) {
+ options.width = options.minWidth;
+ }
+
+ // reset wrapper sizing
+ // determine the height of all the non-content elements
+ nonContentHeight = this.uiDialog.css({
+ height: 'auto',
+ width: options.width
+ })
+ .height();
+ minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
+
+ if ( options.height === "auto" ) {
+ // only needed for IE6 support
+ if ( $.support.minHeight ) {
+ this.element.css({
+ minHeight: minContentHeight,
+ height: "auto"
+ });
+ } else {
+ this.uiDialog.show();
+ var autoHeight = this.element.css( "height", "auto" ).height();
+ if ( !isVisible ) {
+ this.uiDialog.hide();
+ }
+ this.element.height( Math.max( autoHeight, minContentHeight ) );
+ }
+ } else {
+ this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
+ }
+
+ if (this.uiDialog.is(':data(resizable)')) {
+ this.uiDialog.resizable('option', 'minHeight', this._minHeight());
+ }
+ }
+});
+
+$.extend($.ui.dialog, {
+ version: "1.8.10",
+
+ uuid: 0,
+ maxZ: 0,
+
+ getTitleId: function($el) {
+ var id = $el.attr('id');
+ if (!id) {
+ this.uuid += 1;
+ id = this.uuid;
+ }
+ return 'ui-dialog-title-' + id;
+ },
+
+ overlay: function(dialog) {
+ this.$el = $.ui.dialog.overlay.create(dialog);
+ }
+});
+
+$.extend($.ui.dialog.overlay, {
+ instances: [],
+ // reuse old instances due to IE memory leak with alpha transparency (see #5185)
+ oldInstances: [],
+ maxZ: 0,
+ events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
+ function(event) { return event + '.dialog-overlay'; }).join(' '),
+ create: function(dialog) {
+ if (this.instances.length === 0) {
+ // prevent use of anchors and inputs
+ // we use a setTimeout in case the overlay is created from an
+ // event that we're going to be cancelling (see #2804)
+ setTimeout(function() {
+ // handle $(el).dialog().dialog('close') (see #4065)
+ if ($.ui.dialog.overlay.instances.length) {
+ $(document).bind($.ui.dialog.overlay.events, function(event) {
+ // stop events if the z-index of the target is < the z-index of the overlay
+ // we cannot return true when we don't want to cancel the event (#3523)
+ if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
+ return false;
+ }
+ });
+ }
+ }, 1);
+
+ // allow closing by pressing the escape key
+ $(document).bind('keydown.dialog-overlay', function(event) {
+ if (dialog.options.closeOnEscape && event.keyCode &&
+ event.keyCode === $.ui.keyCode.ESCAPE) {
+
+ dialog.close(event);
+ event.preventDefault();
+ }
+ });
+
+ // handle window resize
+ $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
+ }
+
+ var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
+ .appendTo(document.body)
+ .css({
+ width: this.width(),
+ height: this.height()
+ });
+
+ if ($.fn.bgiframe) {
+ $el.bgiframe();
+ }
+
+ this.instances.push($el);
+ return $el;
+ },
+
+ destroy: function($el) {
+ var indexOf = $.inArray($el, this.instances);
+ if (indexOf != -1){
+ this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
+ }
+
+ if (this.instances.length === 0) {
+ $([document, window]).unbind('.dialog-overlay');
+ }
+
+ $el.remove();
+
+ // adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+ var maxZ = 0;
+ $.each(this.instances, function() {
+ maxZ = Math.max(maxZ, this.css('z-index'));
+ });
+ this.maxZ = maxZ;
+ },
+
+ height: function() {
+ var scrollHeight,
+ offsetHeight;
+ // handle IE 6
+ if ($.browser.msie && $.browser.version < 7) {
+ scrollHeight = Math.max(
+ document.documentElement.scrollHeight,
+ document.body.scrollHeight
+ );
+ offsetHeight = Math.max(
+ document.documentElement.offsetHeight,
+ document.body.offsetHeight
+ );
+
+ if (scrollHeight < offsetHeight) {
+ return $(window).height() + 'px';
+ } else {
+ return scrollHeight + 'px';
+ }
+ // handle "good" browsers
+ } else {
+ return $(document).height() + 'px';
+ }
+ },
+
+ width: function() {
+ var scrollWidth,
+ offsetWidth;
+ // handle IE 6
+ if ($.browser.msie && $.browser.version < 7) {
+ scrollWidth = Math.max(
+ document.documentElement.scrollWidth,
+ document.body.scrollWidth
+ );
+ offsetWidth = Math.max(
+ document.documentElement.offsetWidth,
+ document.body.offsetWidth
+ );
+
+ if (scrollWidth < offsetWidth) {
+ return $(window).width() + 'px';
+ } else {
+ return scrollWidth + 'px';
+ }
+ // handle "good" browsers
+ } else {
+ return $(document).width() + 'px';
+ }
+ },
+
+ resize: function() {
+ /* If the dialog is draggable and the user drags it past the
+ * right edge of the window, the document becomes wider so we
+ * need to stretch the overlay. If the user then drags the
+ * dialog back to the left, the document will become narrower,
+ * so we need to shrink the overlay to the appropriate size.
+ * This is handled by shrinking the overlay before setting it
+ * to the full document size.
+ */
+ var $overlays = $([]);
+ $.each($.ui.dialog.overlay.instances, function() {
+ $overlays = $overlays.add(this);
+ });
+
+ $overlays.css({
+ width: 0,
+ height: 0
+ }).css({
+ width: $.ui.dialog.overlay.width(),
+ height: $.ui.dialog.overlay.height()
+ });
+ }
+});
+
+$.extend($.ui.dialog.overlay.prototype, {
+ destroy: function() {
+ $.ui.dialog.overlay.destroy(this.$el);
+ }
+});
+
+}(jQuery));
--- /dev/null
+/*
+ * jQuery UI Draggable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.draggable", $.ui.mouse, {
+ widgetEventPrefix: "drag",
+ options: {
+ addClasses: true,
+ appendTo: "parent",
+ axis: false,
+ connectToSortable: false,
+ containment: false,
+ cursor: "auto",
+ cursorAt: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ iframeFix: false,
+ opacity: false,
+ refreshPositions: false,
+ revert: false,
+ revertDuration: 500,
+ scope: "default",
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ snap: false,
+ snapMode: "both",
+ snapTolerance: 20,
+ stack: false,
+ zIndex: false
+ },
+ _create: function() {
+
+ if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
+ this.element[0].style.position = 'relative';
+
+ (this.options.addClasses && this.element.addClass("ui-draggable"));
+ (this.options.disabled && this.element.addClass("ui-draggable-disabled"));
+
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+ if(!this.element.data('draggable')) return;
+ this.element
+ .removeData("draggable")
+ .unbind(".draggable")
+ .removeClass("ui-draggable"
+ + " ui-draggable-dragging"
+ + " ui-draggable-disabled");
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseCapture: function(event) {
+
+ var o = this.options;
+
+ // among others, prevent a drag on a resizable-handle
+ if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
+ return false;
+
+ //Quit if we're not on a valid handle
+ this.handle = this._getHandle(event);
+ if (!this.handle)
+ return false;
+
+ return true;
+
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options;
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ //If ddmanager is used for droppables, set the global draggable
+ if($.ui.ddmanager)
+ $.ui.ddmanager.current = this;
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Store the helper's css position
+ this.cssPosition = this.helper.css("position");
+ this.scrollParent = this.helper.scrollParent();
+
+ //The element's absolute position on the page minus margins
+ this.offset = this.positionAbs = this.element.offset();
+ this.offset = {
+ top: this.offset.top - this.margins.top,
+ left: this.offset.left - this.margins.left
+ };
+
+ $.extend(this.offset, {
+ click: { //Where the click happened, relative to the element
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ },
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+ });
+
+ //Generate the original position
+ this.originalPosition = this.position = this._generatePosition(event);
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Set a containment if given in the options
+ if(o.containment)
+ this._setContainment();
+
+ //Trigger event + callbacks
+ if(this._trigger("start", event) === false) {
+ this._clear();
+ return false;
+ }
+
+ //Recache the helper size
+ this._cacheHelperProportions();
+
+ //Prepare the droppable offsets
+ if ($.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+
+ this.helper.addClass("ui-draggable-dragging");
+ this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+ return true;
+ },
+
+ _mouseDrag: function(event, noPropagation) {
+
+ //Compute the helpers position
+ this.position = this._generatePosition(event);
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Call plugins and callbacks and use the resulting position if something is returned
+ if (!noPropagation) {
+ var ui = this._uiHash();
+ if(this._trigger('drag', event, ui) === false) {
+ this._mouseUp({});
+ return false;
+ }
+ this.position = ui.position;
+ }
+
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ //If we are using droppables, inform the manager about the drop
+ var dropped = false;
+ if ($.ui.ddmanager && !this.options.dropBehaviour)
+ dropped = $.ui.ddmanager.drop(this, event);
+
+ //if a drop comes from outside (a sortable)
+ if(this.dropped) {
+ dropped = this.dropped;
+ this.dropped = false;
+ }
+
+ //if the original element is removed, don't bother to continue if helper is set to "original"
+ if((!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original")
+ return false;
+
+ if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
+ var self = this;
+ $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
+ if(self._trigger("stop", event) !== false) {
+ self._clear();
+ }
+ });
+ } else {
+ if(this._trigger("stop", event) !== false) {
+ this._clear();
+ }
+ }
+
+ return false;
+ },
+
+ cancel: function() {
+
+ if(this.helper.is(".ui-draggable-dragging")) {
+ this._mouseUp({});
+ } else {
+ this._clear();
+ }
+
+ return this;
+
+ },
+
+ _getHandle: function(event) {
+
+ var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
+ $(this.options.handle, this.element)
+ .find("*")
+ .andSelf()
+ .each(function() {
+ if(this == event.target) handle = true;
+ });
+
+ return handle;
+
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options;
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element);
+
+ if(!helper.parents('body').length)
+ helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
+
+ if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
+ helper.css("position", "absolute");
+
+ return helper;
+
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj == 'string') {
+ obj = obj.split(' ');
+ }
+ if ($.isArray(obj)) {
+ obj = {left: +obj[0], top: +obj[1] || 0};
+ }
+ if ('left' in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ('right' in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+ }
+ if ('top' in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ('bottom' in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+ }
+ },
+
+ _getParentOffset: function() {
+
+ //Get the offsetParent and cache its position
+ this.offsetParent = this.helper.offsetParent();
+ var po = this.offsetParent.offset();
+
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+ if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+ || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+ po = { top: 0, left: 0 };
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+
+ if(this.cssPosition == "relative") {
+ var p = this.element.position();
+ return {
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+ };
+ } else {
+ return { top: 0, left: 0 };
+ }
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.element.css("marginLeft"),10) || 0),
+ top: (parseInt(this.element.css("marginTop"),10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var o = this.options;
+ if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+ if(o.containment == 'document' || o.containment == 'window') this.containment = [
+ (o.containment == 'document' ? 0 : $(window).scrollLeft()) - this.offset.relative.left - this.offset.parent.left,
+ (o.containment == 'document' ? 0 : $(window).scrollTop()) - this.offset.relative.top - this.offset.parent.top,
+ (o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+ (o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+ ];
+
+ if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
+ var ce = $(o.containment)[0]; if(!ce) return;
+ var co = $(o.containment).offset();
+ var over = ($(ce).css("overflow") != 'hidden');
+
+ this.containment = [
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+ ];
+ } else if(o.containment.constructor == Array) {
+ this.containment = o.containment;
+ }
+
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if(!pos) pos = this.position;
+ var mod = d == "absolute" ? 1 : -1;
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ return {
+ top: (
+ pos.top // The absolute mouse position
+ + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+ ),
+ left: (
+ pos.left // The absolute mouse position
+ + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function(event) {
+
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+ var pageX = event.pageX;
+ var pageY = event.pageY;
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+ if(this.containment) {
+ if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+ if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+ }
+
+ if(o.grid) {
+ var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+ pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+ var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+ pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ }
+
+ }
+
+ return {
+ top: (
+ pageY // The absolute mouse position
+ - this.offset.click.top // Click offset (relative to the element)
+ - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+ ),
+ left: (
+ pageX // The absolute mouse position
+ - this.offset.click.left // Click offset (relative to the element)
+ - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+ )
+ };
+
+ },
+
+ _clear: function() {
+ this.helper.removeClass("ui-draggable-dragging");
+ if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
+ //if($.ui.ddmanager) $.ui.ddmanager.current = null;
+ this.helper = null;
+ this.cancelHelperRemoval = false;
+ },
+
+ // From now on bulk stuff - mainly helpers
+
+ _trigger: function(type, event, ui) {
+ ui = ui || this._uiHash();
+ $.ui.plugin.call(this, type, [event, ui]);
+ if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
+ return $.Widget.prototype._trigger.call(this, type, event, ui);
+ },
+
+ plugins: {},
+
+ _uiHash: function(event) {
+ return {
+ helper: this.helper,
+ position: this.position,
+ originalPosition: this.originalPosition,
+ offset: this.positionAbs
+ };
+ }
+
+});
+
+$.extend($.ui.draggable, {
+ version: "1.8.10"
+});
+
+$.ui.plugin.add("draggable", "connectToSortable", {
+ start: function(event, ui) {
+
+ var inst = $(this).data("draggable"), o = inst.options,
+ uiSortable = $.extend({}, ui, { item: inst.element });
+ inst.sortables = [];
+ $(o.connectToSortable).each(function() {
+ var sortable = $.data(this, 'sortable');
+ if (sortable && !sortable.options.disabled) {
+ inst.sortables.push({
+ instance: sortable,
+ shouldRevert: sortable.options.revert
+ });
+ sortable._refreshItems(); //Do a one-time refresh at start to refresh the containerCache
+ sortable._trigger("activate", event, uiSortable);
+ }
+ });
+
+ },
+ stop: function(event, ui) {
+
+ //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
+ var inst = $(this).data("draggable"),
+ uiSortable = $.extend({}, ui, { item: inst.element });
+
+ $.each(inst.sortables, function() {
+ if(this.instance.isOver) {
+
+ this.instance.isOver = 0;
+
+ inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
+ this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
+
+ //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
+ if(this.shouldRevert) this.instance.options.revert = true;
+
+ //Trigger the stop of the sortable
+ this.instance._mouseStop(event);
+
+ this.instance.options.helper = this.instance.options._helper;
+
+ //If the helper has been the original item, restore properties in the sortable
+ if(inst.options.helper == 'original')
+ this.instance.currentItem.css({ top: 'auto', left: 'auto' });
+
+ } else {
+ this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
+ this.instance._trigger("deactivate", event, uiSortable);
+ }
+
+ });
+
+ },
+ drag: function(event, ui) {
+
+ var inst = $(this).data("draggable"), self = this;
+
+ var checkPos = function(o) {
+ var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
+ var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
+ var itemHeight = o.height, itemWidth = o.width;
+ var itemTop = o.top, itemLeft = o.left;
+
+ return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
+ };
+
+ $.each(inst.sortables, function(i) {
+
+ //Copy over some variables to allow calling the sortable's native _intersectsWith
+ this.instance.positionAbs = inst.positionAbs;
+ this.instance.helperProportions = inst.helperProportions;
+ this.instance.offset.click = inst.offset.click;
+
+ if(this.instance._intersectsWith(this.instance.containerCache)) {
+
+ //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
+ if(!this.instance.isOver) {
+
+ this.instance.isOver = 1;
+ //Now we fake the start of dragging for the sortable instance,
+ //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
+ //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
+ this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true);
+ this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
+ this.instance.options.helper = function() { return ui.helper[0]; };
+
+ event.target = this.instance.currentItem[0];
+ this.instance._mouseCapture(event, true);
+ this.instance._mouseStart(event, true, true);
+
+ //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
+ this.instance.offset.click.top = inst.offset.click.top;
+ this.instance.offset.click.left = inst.offset.click.left;
+ this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
+ this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
+
+ inst._trigger("toSortable", event);
+ inst.dropped = this.instance.element; //draggable revert needs that
+ //hack so receive/update callbacks work (mostly)
+ inst.currentItem = inst.element;
+ this.instance.fromOutside = inst;
+
+ }
+
+ //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
+ if(this.instance.currentItem) this.instance._mouseDrag(event);
+
+ } else {
+
+ //If it doesn't intersect with the sortable, and it intersected before,
+ //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
+ if(this.instance.isOver) {
+
+ this.instance.isOver = 0;
+ this.instance.cancelHelperRemoval = true;
+
+ //Prevent reverting on this forced stop
+ this.instance.options.revert = false;
+
+ // The out event needs to be triggered independently
+ this.instance._trigger('out', event, this.instance._uiHash(this.instance));
+
+ this.instance._mouseStop(event, true);
+ this.instance.options.helper = this.instance.options._helper;
+
+ //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
+ this.instance.currentItem.remove();
+ if(this.instance.placeholder) this.instance.placeholder.remove();
+
+ inst._trigger("fromSortable", event);
+ inst.dropped = false; //draggable revert needs that
+ }
+
+ };
+
+ });
+
+ }
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+ start: function(event, ui) {
+ var t = $('body'), o = $(this).data('draggable').options;
+ if (t.css("cursor")) o._cursor = t.css("cursor");
+ t.css("cursor", o.cursor);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ if (o._cursor) $('body').css("cursor", o._cursor);
+ }
+});
+
+$.ui.plugin.add("draggable", "iframeFix", {
+ start: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+ $('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
+ .css({
+ width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+ position: "absolute", opacity: "0.001", zIndex: 1000
+ })
+ .css($(this).offset())
+ .appendTo("body");
+ });
+ },
+ stop: function(event, ui) {
+ $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers
+ }
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+ start: function(event, ui) {
+ var t = $(ui.helper), o = $(this).data('draggable').options;
+ if(t.css("opacity")) o._opacity = t.css("opacity");
+ t.css('opacity', o.opacity);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ if(o._opacity) $(ui.helper).css('opacity', o._opacity);
+ }
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+ start: function(event, ui) {
+ var i = $(this).data("draggable");
+ if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
+ },
+ drag: function(event, ui) {
+
+ var i = $(this).data("draggable"), o = i.options, scrolled = false;
+
+ if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
+
+ if(!o.axis || o.axis != 'x') {
+ if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+ i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
+ else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
+ i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
+ }
+
+ if(!o.axis || o.axis != 'y') {
+ if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+ i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
+ else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
+ i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
+ }
+
+ } else {
+
+ if(!o.axis || o.axis != 'x') {
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+ }
+
+ if(!o.axis || o.axis != 'y') {
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+ }
+
+ }
+
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(i, event);
+
+ }
+});
+
+$.ui.plugin.add("draggable", "snap", {
+ start: function(event, ui) {
+
+ var i = $(this).data("draggable"), o = i.options;
+ i.snapElements = [];
+
+ $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
+ var $t = $(this); var $o = $t.offset();
+ if(this != i.element[0]) i.snapElements.push({
+ item: this,
+ width: $t.outerWidth(), height: $t.outerHeight(),
+ top: $o.top, left: $o.left
+ });
+ });
+
+ },
+ drag: function(event, ui) {
+
+ var inst = $(this).data("draggable"), o = inst.options;
+ var d = o.snapTolerance;
+
+ var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+ y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+ for (var i = inst.snapElements.length - 1; i >= 0; i--){
+
+ var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
+ t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
+
+ //Yes, I know, this is insane ;)
+ if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
+ if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ inst.snapElements[i].snapping = false;
+ continue;
+ }
+
+ if(o.snapMode != 'inner') {
+ var ts = Math.abs(t - y2) <= d;
+ var bs = Math.abs(b - y1) <= d;
+ var ls = Math.abs(l - x2) <= d;
+ var rs = Math.abs(r - x1) <= d;
+ if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+ if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
+ if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
+ if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
+ }
+
+ var first = (ts || bs || ls || rs);
+
+ if(o.snapMode != 'outer') {
+ var ts = Math.abs(t - y1) <= d;
+ var bs = Math.abs(b - y2) <= d;
+ var ls = Math.abs(l - x1) <= d;
+ var rs = Math.abs(r - x2) <= d;
+ if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
+ if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+ if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
+ if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
+ }
+
+ if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
+ (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+ };
+
+ }
+});
+
+$.ui.plugin.add("draggable", "stack", {
+ start: function(event, ui) {
+
+ var o = $(this).data("draggable").options;
+
+ var group = $.makeArray($(o.stack)).sort(function(a,b) {
+ return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
+ });
+ if (!group.length) { return; }
+
+ var min = parseInt(group[0].style.zIndex) || 0;
+ $(group).each(function(i) {
+ this.style.zIndex = min + i;
+ });
+
+ this[0].style.zIndex = min + group.length;
+
+ }
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+ start: function(event, ui) {
+ var t = $(ui.helper), o = $(this).data("draggable").options;
+ if(t.css("zIndex")) o._zIndex = t.css("zIndex");
+ t.css('zIndex', o.zIndex);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data("draggable").options;
+ if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
+ }
+});
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Droppable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ * jquery.ui.mouse.js
+ * jquery.ui.draggable.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.droppable", {
+ widgetEventPrefix: "drop",
+ options: {
+ accept: '*',
+ activeClass: false,
+ addClasses: true,
+ greedy: false,
+ hoverClass: false,
+ scope: 'default',
+ tolerance: 'intersect'
+ },
+ _create: function() {
+
+ var o = this.options, accept = o.accept;
+ this.isover = 0; this.isout = 1;
+
+ this.accept = $.isFunction(accept) ? accept : function(d) {
+ return d.is(accept);
+ };
+
+ //Store the droppable's proportions
+ this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
+
+ // Add the reference and positions to the manager
+ $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
+ $.ui.ddmanager.droppables[o.scope].push(this);
+
+ (o.addClasses && this.element.addClass("ui-droppable"));
+
+ },
+
+ destroy: function() {
+ var drop = $.ui.ddmanager.droppables[this.options.scope];
+ for ( var i = 0; i < drop.length; i++ )
+ if ( drop[i] == this )
+ drop.splice(i, 1);
+
+ this.element
+ .removeClass("ui-droppable ui-droppable-disabled")
+ .removeData("droppable")
+ .unbind(".droppable");
+
+ return this;
+ },
+
+ _setOption: function(key, value) {
+
+ if(key == 'accept') {
+ this.accept = $.isFunction(value) ? value : function(d) {
+ return d.is(value);
+ };
+ }
+ $.Widget.prototype._setOption.apply(this, arguments);
+ },
+
+ _activate: function(event) {
+ var draggable = $.ui.ddmanager.current;
+ if(this.options.activeClass) this.element.addClass(this.options.activeClass);
+ (draggable && this._trigger('activate', event, this.ui(draggable)));
+ },
+
+ _deactivate: function(event) {
+ var draggable = $.ui.ddmanager.current;
+ if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+ (draggable && this._trigger('deactivate', event, this.ui(draggable)));
+ },
+
+ _over: function(event) {
+
+ var draggable = $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+ if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
+ this._trigger('over', event, this.ui(draggable));
+ }
+
+ },
+
+ _out: function(event) {
+
+ var draggable = $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+ if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+ this._trigger('out', event, this.ui(draggable));
+ }
+
+ },
+
+ _drop: function(event,custom) {
+
+ var draggable = custom || $.ui.ddmanager.current;
+ if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
+
+ var childrenIntersection = false;
+ this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
+ var inst = $.data(this, 'droppable');
+ if(
+ inst.options.greedy
+ && !inst.options.disabled
+ && inst.options.scope == draggable.options.scope
+ && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
+ && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
+ ) { childrenIntersection = true; return false; }
+ });
+ if(childrenIntersection) return false;
+
+ if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+ if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+ this._trigger('drop', event, this.ui(draggable));
+ return this.element;
+ }
+
+ return false;
+
+ },
+
+ ui: function(c) {
+ return {
+ draggable: (c.currentItem || c.element),
+ helper: c.helper,
+ position: c.position,
+ offset: c.positionAbs
+ };
+ }
+
+});
+
+$.extend($.ui.droppable, {
+ version: "1.8.10"
+});
+
+$.ui.intersect = function(draggable, droppable, toleranceMode) {
+
+ if (!droppable.offset) return false;
+
+ var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
+ y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
+ var l = droppable.offset.left, r = l + droppable.proportions.width,
+ t = droppable.offset.top, b = t + droppable.proportions.height;
+
+ switch (toleranceMode) {
+ case 'fit':
+ return (l <= x1 && x2 <= r
+ && t <= y1 && y2 <= b);
+ break;
+ case 'intersect':
+ return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
+ && x2 - (draggable.helperProportions.width / 2) < r // Left Half
+ && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
+ && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
+ break;
+ case 'pointer':
+ var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
+ draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
+ isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
+ return isOver;
+ break;
+ case 'touch':
+ return (
+ (y1 >= t && y1 <= b) || // Top edge touching
+ (y2 >= t && y2 <= b) || // Bottom edge touching
+ (y1 < t && y2 > b) // Surrounded vertically
+ ) && (
+ (x1 >= l && x1 <= r) || // Left edge touching
+ (x2 >= l && x2 <= r) || // Right edge touching
+ (x1 < l && x2 > r) // Surrounded horizontally
+ );
+ break;
+ default:
+ return false;
+ break;
+ }
+
+};
+
+/*
+ This manager tracks offsets of draggables and droppables
+*/
+$.ui.ddmanager = {
+ current: null,
+ droppables: { 'default': [] },
+ prepareOffsets: function(t, event) {
+
+ var m = $.ui.ddmanager.droppables[t.options.scope] || [];
+ var type = event ? event.type : null; // workaround for #2317
+ var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
+
+ droppablesLoop: for (var i = 0; i < m.length; i++) {
+
+ if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted
+ for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
+ m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue
+
+ m[i].offset = m[i].element.offset();
+ m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
+
+ if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
+
+ }
+
+ },
+ drop: function(draggable, event) {
+
+ var dropped = false;
+ $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+ if(!this.options) return;
+ if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
+ dropped = dropped || this._drop.call(this, event);
+
+ if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+ this.isout = 1; this.isover = 0;
+ this._deactivate.call(this, event);
+ }
+
+ });
+ return dropped;
+
+ },
+ drag: function(draggable, event) {
+
+ //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
+ if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
+
+ //Run through all droppables and check their positions based on specific tolerance options
+ $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+ if(this.options.disabled || this.greedyChild || !this.visible) return;
+ var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
+
+ var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
+ if(!c) return;
+
+ var parentInstance;
+ if (this.options.greedy) {
+ var parent = this.element.parents(':data(droppable):eq(0)');
+ if (parent.length) {
+ parentInstance = $.data(parent[0], 'droppable');
+ parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
+ }
+ }
+
+ // we just moved into a greedy child
+ if (parentInstance && c == 'isover') {
+ parentInstance['isover'] = 0;
+ parentInstance['isout'] = 1;
+ parentInstance._out.call(parentInstance, event);
+ }
+
+ this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
+ this[c == "isover" ? "_over" : "_out"].call(this, event);
+
+ // we just moved out of a greedy child
+ if (parentInstance && c == 'isout') {
+ parentInstance['isout'] = 0;
+ parentInstance['isover'] = 1;
+ parentInstance._over.call(parentInstance, event);
+ }
+ });
+
+ }
+};
+
+})(jQuery);
--- /dev/null
+/*!
+ * jQuery UI Mouse 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.mouse", {
+ options: {
+ cancel: ':input,option',
+ distance: 1,
+ delay: 0
+ },
+ _mouseInit: function() {
+ var self = this;
+
+ this.element
+ .bind('mousedown.'+this.widgetName, function(event) {
+ return self._mouseDown(event);
+ })
+ .bind('click.'+this.widgetName, function(event) {
+ if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
+ $.removeData(event.target, self.widgetName + '.preventClickEvent');
+ event.stopImmediatePropagation();
+ return false;
+ }
+ });
+
+ this.started = false;
+ },
+
+ // TODO: make sure destroying one instance of mouse doesn't mess with
+ // other instances of mouse
+ _mouseDestroy: function() {
+ this.element.unbind('.'+this.widgetName);
+ },
+
+ _mouseDown: function(event) {
+ // don't let more than one widget handle mouseStart
+ // TODO: figure out why we have to use originalEvent
+ event.originalEvent = event.originalEvent || {};
+ if (event.originalEvent.mouseHandled) { return; }
+
+ // we may have missed mouseup (out of window)
+ (this._mouseStarted && this._mouseUp(event));
+
+ this._mouseDownEvent = event;
+
+ var self = this,
+ btnIsLeft = (event.which == 1),
+ elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+ return true;
+ }
+
+ this.mouseDelayMet = !this.options.delay;
+ if (!this.mouseDelayMet) {
+ this._mouseDelayTimer = setTimeout(function() {
+ self.mouseDelayMet = true;
+ }, this.options.delay);
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted = (this._mouseStart(event) !== false);
+ if (!this._mouseStarted) {
+ event.preventDefault();
+ return true;
+ }
+ }
+
+ // these delegates are required to keep context
+ this._mouseMoveDelegate = function(event) {
+ return self._mouseMove(event);
+ };
+ this._mouseUpDelegate = function(event) {
+ return self._mouseUp(event);
+ };
+ $(document)
+ .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+ .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+ event.preventDefault();
+ event.originalEvent.mouseHandled = true;
+ return true;
+ },
+
+ _mouseMove: function(event) {
+ // IE mouseup check - mouseup happened when mouse was out of window
+ if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
+ return this._mouseUp(event);
+ }
+
+ if (this._mouseStarted) {
+ this._mouseDrag(event);
+ return event.preventDefault();
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted =
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+ }
+
+ return !this._mouseStarted;
+ },
+
+ _mouseUp: function(event) {
+ $(document)
+ .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+ .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+ if (this._mouseStarted) {
+ this._mouseStarted = false;
+
+ if (event.target == this._mouseDownEvent.target) {
+ $.data(event.target, this.widgetName + '.preventClickEvent', true);
+ }
+
+ this._mouseStop(event);
+ }
+
+ return false;
+ },
+
+ _mouseDistanceMet: function(event) {
+ return (Math.max(
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
+ ) >= this.options.distance
+ );
+ },
+
+ _mouseDelayMet: function(event) {
+ return this.mouseDelayMet;
+ },
+
+ // These are placeholder methods, to be overriden by extending plugin
+ _mouseStart: function(event) {},
+ _mouseDrag: function(event) {},
+ _mouseStop: function(event) {},
+ _mouseCapture: function(event) { return true; }
+});
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Position 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function( $, undefined ) {
+
+$.ui = $.ui || {};
+
+var horizontalPositions = /left|center|right/,
+ verticalPositions = /top|center|bottom/,
+ center = "center",
+ _position = $.fn.position,
+ _offset = $.fn.offset;
+
+$.fn.position = function( options ) {
+ if ( !options || !options.of ) {
+ return _position.apply( this, arguments );
+ }
+
+ // make a copy, we don't want to modify arguments
+ options = $.extend( {}, options );
+
+ var target = $( options.of ),
+ targetElem = target[0],
+ collision = ( options.collision || "flip" ).split( " " ),
+ offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
+ targetWidth,
+ targetHeight,
+ basePosition;
+
+ if ( targetElem.nodeType === 9 ) {
+ targetWidth = target.width();
+ targetHeight = target.height();
+ basePosition = { top: 0, left: 0 };
+ // TODO: use $.isWindow() in 1.9
+ } else if ( targetElem.setTimeout ) {
+ targetWidth = target.width();
+ targetHeight = target.height();
+ basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
+ } else if ( targetElem.preventDefault ) {
+ // force left top to allow flipping
+ options.at = "left top";
+ targetWidth = targetHeight = 0;
+ basePosition = { top: options.of.pageY, left: options.of.pageX };
+ } else {
+ targetWidth = target.outerWidth();
+ targetHeight = target.outerHeight();
+ basePosition = target.offset();
+ }
+
+ // force my and at to have valid horizontal and veritcal positions
+ // if a value is missing or invalid, it will be converted to center
+ $.each( [ "my", "at" ], function() {
+ var pos = ( options[this] || "" ).split( " " );
+ if ( pos.length === 1) {
+ pos = horizontalPositions.test( pos[0] ) ?
+ pos.concat( [center] ) :
+ verticalPositions.test( pos[0] ) ?
+ [ center ].concat( pos ) :
+ [ center, center ];
+ }
+ pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
+ pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
+ options[ this ] = pos;
+ });
+
+ // normalize collision option
+ if ( collision.length === 1 ) {
+ collision[ 1 ] = collision[ 0 ];
+ }
+
+ // normalize offset option
+ offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
+ if ( offset.length === 1 ) {
+ offset[ 1 ] = offset[ 0 ];
+ }
+ offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
+
+ if ( options.at[0] === "right" ) {
+ basePosition.left += targetWidth;
+ } else if ( options.at[0] === center ) {
+ basePosition.left += targetWidth / 2;
+ }
+
+ if ( options.at[1] === "bottom" ) {
+ basePosition.top += targetHeight;
+ } else if ( options.at[1] === center ) {
+ basePosition.top += targetHeight / 2;
+ }
+
+ basePosition.left += offset[ 0 ];
+ basePosition.top += offset[ 1 ];
+
+ return this.each(function() {
+ var elem = $( this ),
+ elemWidth = elem.outerWidth(),
+ elemHeight = elem.outerHeight(),
+ marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
+ marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
+ collisionWidth = elemWidth + marginLeft +
+ ( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
+ collisionHeight = elemHeight + marginTop +
+ ( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
+ position = $.extend( {}, basePosition ),
+ collisionPosition;
+
+ if ( options.my[0] === "right" ) {
+ position.left -= elemWidth;
+ } else if ( options.my[0] === center ) {
+ position.left -= elemWidth / 2;
+ }
+
+ if ( options.my[1] === "bottom" ) {
+ position.top -= elemHeight;
+ } else if ( options.my[1] === center ) {
+ position.top -= elemHeight / 2;
+ }
+
+ // prevent fractions (see #5280)
+ position.left = Math.round( position.left );
+ position.top = Math.round( position.top );
+
+ collisionPosition = {
+ left: position.left - marginLeft,
+ top: position.top - marginTop
+ };
+
+ $.each( [ "left", "top" ], function( i, dir ) {
+ if ( $.ui.position[ collision[i] ] ) {
+ $.ui.position[ collision[i] ][ dir ]( position, {
+ targetWidth: targetWidth,
+ targetHeight: targetHeight,
+ elemWidth: elemWidth,
+ elemHeight: elemHeight,
+ collisionPosition: collisionPosition,
+ collisionWidth: collisionWidth,
+ collisionHeight: collisionHeight,
+ offset: offset,
+ my: options.my,
+ at: options.at
+ });
+ }
+ });
+
+ if ( $.fn.bgiframe ) {
+ elem.bgiframe();
+ }
+ elem.offset( $.extend( position, { using: options.using } ) );
+ });
+};
+
+$.ui.position = {
+ fit: {
+ left: function( position, data ) {
+ var win = $( window ),
+ over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
+ position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
+ },
+ top: function( position, data ) {
+ var win = $( window ),
+ over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
+ position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
+ }
+ },
+
+ flip: {
+ left: function( position, data ) {
+ if ( data.at[0] === center ) {
+ return;
+ }
+ var win = $( window ),
+ over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
+ myOffset = data.my[ 0 ] === "left" ?
+ -data.elemWidth :
+ data.my[ 0 ] === "right" ?
+ data.elemWidth :
+ 0,
+ atOffset = data.at[ 0 ] === "left" ?
+ data.targetWidth :
+ -data.targetWidth,
+ offset = -2 * data.offset[ 0 ];
+ position.left += data.collisionPosition.left < 0 ?
+ myOffset + atOffset + offset :
+ over > 0 ?
+ myOffset + atOffset + offset :
+ 0;
+ },
+ top: function( position, data ) {
+ if ( data.at[1] === center ) {
+ return;
+ }
+ var win = $( window ),
+ over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
+ myOffset = data.my[ 1 ] === "top" ?
+ -data.elemHeight :
+ data.my[ 1 ] === "bottom" ?
+ data.elemHeight :
+ 0,
+ atOffset = data.at[ 1 ] === "top" ?
+ data.targetHeight :
+ -data.targetHeight,
+ offset = -2 * data.offset[ 1 ];
+ position.top += data.collisionPosition.top < 0 ?
+ myOffset + atOffset + offset :
+ over > 0 ?
+ myOffset + atOffset + offset :
+ 0;
+ }
+ }
+};
+
+// offset setter from jQuery 1.4
+if ( !$.offset.setOffset ) {
+ $.offset.setOffset = function( elem, options ) {
+ // set position first, in-case top/left are set even on static elem
+ if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
+ elem.style.position = "relative";
+ }
+ var curElem = $( elem ),
+ curOffset = curElem.offset(),
+ curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0,
+ curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0,
+ props = {
+ top: (options.top - curOffset.top) + curTop,
+ left: (options.left - curOffset.left) + curLeft
+ };
+
+ if ( 'using' in options ) {
+ options.using.call( elem, props );
+ } else {
+ curElem.css( props );
+ }
+ };
+
+ $.fn.offset = function( options ) {
+ var elem = this[ 0 ];
+ if ( !elem || !elem.ownerDocument ) { return null; }
+ if ( options ) {
+ return this.each(function() {
+ $.offset.setOffset( this, options );
+ });
+ }
+ return _offset.call( this );
+ };
+}
+
+}( jQuery ));
--- /dev/null
+/*
+ * jQuery UI Progressbar 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.progressbar", {
+ options: {
+ value: 0,
+ max: 100
+ },
+
+ min: 0,
+
+ _create: function() {
+ this.element
+ .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .attr({
+ role: "progressbar",
+ "aria-valuemin": this.min,
+ "aria-valuemax": this.options.max,
+ "aria-valuenow": this._value()
+ });
+
+ this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
+ .appendTo( this.element );
+
+ this.oldValue = this._value();
+ this._refreshValue();
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+ .removeAttr( "role" )
+ .removeAttr( "aria-valuemin" )
+ .removeAttr( "aria-valuemax" )
+ .removeAttr( "aria-valuenow" );
+
+ this.valueDiv.remove();
+
+ $.Widget.prototype.destroy.apply( this, arguments );
+ },
+
+ value: function( newValue ) {
+ if ( newValue === undefined ) {
+ return this._value();
+ }
+
+ this._setOption( "value", newValue );
+ return this;
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "value" ) {
+ this.options.value = value;
+ this._refreshValue();
+ if ( this._value() === this.options.max ) {
+ this._trigger( "complete" );
+ }
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+ },
+
+ _value: function() {
+ var val = this.options.value;
+ // normalize invalid value
+ if ( typeof val !== "number" ) {
+ val = 0;
+ }
+ return Math.min( this.options.max, Math.max( this.min, val ) );
+ },
+
+ _percentage: function() {
+ return 100 * this._value() / this.options.max;
+ },
+
+ _refreshValue: function() {
+ var value = this.value();
+ var percentage = this._percentage();
+
+ if ( this.oldValue !== value ) {
+ this.oldValue = value;
+ this._trigger( "change" );
+ }
+
+ this.valueDiv
+ .toggleClass( "ui-corner-right", value === this.options.max )
+ .width( percentage.toFixed(0) + "%" );
+ this.element.attr( "aria-valuenow", value );
+ }
+});
+
+$.extend( $.ui.progressbar, {
+ version: "1.8.10"
+});
+
+})( jQuery );
--- /dev/null
+/*
+ * jQuery UI Resizable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.resizable", $.ui.mouse, {
+ widgetEventPrefix: "resize",
+ options: {
+ alsoResize: false,
+ animate: false,
+ animateDuration: "slow",
+ animateEasing: "swing",
+ aspectRatio: false,
+ autoHide: false,
+ containment: false,
+ ghost: false,
+ grid: false,
+ handles: "e,s,se",
+ helper: false,
+ maxHeight: null,
+ maxWidth: null,
+ minHeight: 10,
+ minWidth: 10,
+ zIndex: 1000
+ },
+ _create: function() {
+
+ var self = this, o = this.options;
+ this.element.addClass("ui-resizable");
+
+ $.extend(this, {
+ _aspectRatio: !!(o.aspectRatio),
+ aspectRatio: o.aspectRatio,
+ originalElement: this.element,
+ _proportionallyResizeElements: [],
+ _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
+ });
+
+ //Wrap the element if it cannot hold child nodes
+ if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
+
+ //Opera fix for relative positioning
+ if (/relative/.test(this.element.css('position')) && $.browser.opera)
+ this.element.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ //Create a wrapper element and set the wrapper to the new current internal element
+ this.element.wrap(
+ $('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
+ position: this.element.css('position'),
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight(),
+ top: this.element.css('top'),
+ left: this.element.css('left')
+ })
+ );
+
+ //Overwrite the original this.element
+ this.element = this.element.parent().data(
+ "resizable", this.element.data('resizable')
+ );
+
+ this.elementIsWrapper = true;
+
+ //Move margins to the wrapper
+ this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
+ this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
+
+ //Prevent Safari textarea resize
+ this.originalResizeStyle = this.originalElement.css('resize');
+ this.originalElement.css('resize', 'none');
+
+ //Push the actual element to our proportionallyResize internal array
+ this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
+
+ // avoid IE jump (hard set the margin)
+ this.originalElement.css({ margin: this.originalElement.css('margin') });
+
+ // fix handlers offset
+ this._proportionallyResize();
+
+ }
+
+ this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
+ if(this.handles.constructor == String) {
+
+ if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
+ var n = this.handles.split(","); this.handles = {};
+
+ for(var i = 0; i < n.length; i++) {
+
+ var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
+ var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
+
+ // increase zIndex of sw, se, ne, nw axis
+ //TODO : this modifies original option
+ if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
+
+ //TODO : What's going on here?
+ if ('se' == handle) {
+ axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
+ };
+
+ //Insert into internal handles object and append to element
+ this.handles[handle] = '.ui-resizable-'+handle;
+ this.element.append(axis);
+ }
+
+ }
+
+ this._renderAxis = function(target) {
+
+ target = target || this.element;
+
+ for(var i in this.handles) {
+
+ if(this.handles[i].constructor == String)
+ this.handles[i] = $(this.handles[i], this.element).show();
+
+ //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
+ if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
+
+ var axis = $(this.handles[i], this.element), padWrapper = 0;
+
+ //Checking the correct pad and border
+ padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+ //The padding type i have to apply...
+ var padPos = [ 'padding',
+ /ne|nw|n/.test(i) ? 'Top' :
+ /se|sw|s/.test(i) ? 'Bottom' :
+ /^e$/.test(i) ? 'Right' : 'Left' ].join("");
+
+ target.css(padPos, padWrapper);
+
+ this._proportionallyResize();
+
+ }
+
+ //TODO: What's that good for? There's not anything to be executed left
+ if(!$(this.handles[i]).length)
+ continue;
+
+ }
+ };
+
+ //TODO: make renderAxis a prototype function
+ this._renderAxis(this.element);
+
+ this._handles = $('.ui-resizable-handle', this.element)
+ .disableSelection();
+
+ //Matching axis name
+ this._handles.mouseover(function() {
+ if (!self.resizing) {
+ if (this.className)
+ var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+ //Axis, default = se
+ self.axis = axis && axis[1] ? axis[1] : 'se';
+ }
+ });
+
+ //If we want to auto hide the elements
+ if (o.autoHide) {
+ this._handles.hide();
+ $(this.element)
+ .addClass("ui-resizable-autohide")
+ .hover(function() {
+ $(this).removeClass("ui-resizable-autohide");
+ self._handles.show();
+ },
+ function(){
+ if (!self.resizing) {
+ $(this).addClass("ui-resizable-autohide");
+ self._handles.hide();
+ }
+ });
+ }
+
+ //Initialize the mouse interaction
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+
+ this._mouseDestroy();
+
+ var _destroy = function(exp) {
+ $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+ .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+ };
+
+ //TODO: Unwrap at same DOM position
+ if (this.elementIsWrapper) {
+ _destroy(this.element);
+ var wrapper = this.element;
+ wrapper.after(
+ this.originalElement.css({
+ position: wrapper.css('position'),
+ width: wrapper.outerWidth(),
+ height: wrapper.outerHeight(),
+ top: wrapper.css('top'),
+ left: wrapper.css('left')
+ })
+ ).remove();
+ }
+
+ this.originalElement.css('resize', this.originalResizeStyle);
+ _destroy(this.originalElement);
+
+ return this;
+ },
+
+ _mouseCapture: function(event) {
+ var handle = false;
+ for (var i in this.handles) {
+ if ($(this.handles[i])[0] == event.target) {
+ handle = true;
+ }
+ }
+
+ return !this.options.disabled && handle;
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options, iniPos = this.element.position(), el = this.element;
+
+ this.resizing = true;
+ this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
+
+ // bugfix for http://dev.jquery.com/ticket/1749
+ if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
+ el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
+ }
+
+ //Opera fixing relative position
+ if ($.browser.opera && (/relative/).test(el.css('position')))
+ el.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ this._renderProxy();
+
+ var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
+
+ if (o.containment) {
+ curleft += $(o.containment).scrollLeft() || 0;
+ curtop += $(o.containment).scrollTop() || 0;
+ }
+
+ //Store needed variables
+ this.offset = this.helper.offset();
+ this.position = { left: curleft, top: curtop };
+ this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+ this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+ this.originalPosition = { left: curleft, top: curtop };
+ this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
+ this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+ //Aspect Ratio
+ this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
+
+ var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+ $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+
+ el.addClass("ui-resizable-resizing");
+ this._propagate("start", event);
+ return true;
+ },
+
+ _mouseDrag: function(event) {
+
+ //Increase performance, avoid regex
+ var el = this.helper, o = this.options, props = {},
+ self = this, smp = this.originalMousePosition, a = this.axis;
+
+ var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
+ var trigger = this._change[a];
+ if (!trigger) return false;
+
+ // Calculate the attrs that will be change
+ var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+
+ if (this._aspectRatio || event.shiftKey)
+ data = this._updateRatio(data, event);
+
+ data = this._respectSize(data, event);
+
+ // plugins callbacks need to be called first
+ this._propagate("resize", event);
+
+ el.css({
+ top: this.position.top + "px", left: this.position.left + "px",
+ width: this.size.width + "px", height: this.size.height + "px"
+ });
+
+ if (!this._helper && this._proportionallyResizeElements.length)
+ this._proportionallyResize();
+
+ this._updateCache(data);
+
+ // calling the user callback at the end
+ this._trigger('resize', event, this.ui());
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ this.resizing = false;
+ var o = this.options, self = this;
+
+ if(this._helper) {
+ var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+ soffsetw = ista ? 0 : self.sizeDiff.width;
+
+ var s = { width: (self.helper.width() - soffsetw), height: (self.helper.height() - soffseth) },
+ left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+ top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+ if (!o.animate)
+ this.element.css($.extend(s, { top: top, left: left }));
+
+ self.helper.height(self.size.height);
+ self.helper.width(self.size.width);
+
+ if (this._helper && !o.animate) this._proportionallyResize();
+ }
+
+ $('body').css('cursor', 'auto');
+
+ this.element.removeClass("ui-resizable-resizing");
+
+ this._propagate("stop", event);
+
+ if (this._helper) this.helper.remove();
+ return false;
+
+ },
+
+ _updateCache: function(data) {
+ var o = this.options;
+ this.offset = this.helper.offset();
+ if (isNumber(data.left)) this.position.left = data.left;
+ if (isNumber(data.top)) this.position.top = data.top;
+ if (isNumber(data.height)) this.size.height = data.height;
+ if (isNumber(data.width)) this.size.width = data.width;
+ },
+
+ _updateRatio: function(data, event) {
+
+ var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
+
+ if (data.height) data.width = (csize.height * this.aspectRatio);
+ else if (data.width) data.height = (csize.width / this.aspectRatio);
+
+ if (a == 'sw') {
+ data.left = cpos.left + (csize.width - data.width);
+ data.top = null;
+ }
+ if (a == 'nw') {
+ data.top = cpos.top + (csize.height - data.height);
+ data.left = cpos.left + (csize.width - data.width);
+ }
+
+ return data;
+ },
+
+ _respectSize: function(data, event) {
+
+ var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
+ ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
+ isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
+
+ if (isminw) data.width = o.minWidth;
+ if (isminh) data.height = o.minHeight;
+ if (ismaxw) data.width = o.maxWidth;
+ if (ismaxh) data.height = o.maxHeight;
+
+ var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
+ var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+
+ if (isminw && cw) data.left = dw - o.minWidth;
+ if (ismaxw && cw) data.left = dw - o.maxWidth;
+ if (isminh && ch) data.top = dh - o.minHeight;
+ if (ismaxh && ch) data.top = dh - o.maxHeight;
+
+ // fixing jump error on top/left - bug #2330
+ var isNotwh = !data.width && !data.height;
+ if (isNotwh && !data.left && data.top) data.top = null;
+ else if (isNotwh && !data.top && data.left) data.left = null;
+
+ return data;
+ },
+
+ _proportionallyResize: function() {
+
+ var o = this.options;
+ if (!this._proportionallyResizeElements.length) return;
+ var element = this.helper || this.element;
+
+ for (var i=0; i < this._proportionallyResizeElements.length; i++) {
+
+ var prel = this._proportionallyResizeElements[i];
+
+ if (!this.borderDif) {
+ var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
+ p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
+
+ this.borderDif = $.map(b, function(v, i) {
+ var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
+ return border + padding;
+ });
+ }
+
+ if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
+ continue;
+
+ prel.css({
+ height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
+ width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
+ });
+
+ };
+
+ },
+
+ _renderProxy: function() {
+
+ var el = this.element, o = this.options;
+ this.elementOffset = el.offset();
+
+ if(this._helper) {
+
+ this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
+
+ // fix ie6 offset TODO: This seems broken
+ var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
+ pxyoffset = ( ie6 ? 2 : -1 );
+
+ this.helper.addClass(this._helper).css({
+ width: this.element.outerWidth() + pxyoffset,
+ height: this.element.outerHeight() + pxyoffset,
+ position: 'absolute',
+ left: this.elementOffset.left - ie6offset +'px',
+ top: this.elementOffset.top - ie6offset +'px',
+ zIndex: ++o.zIndex //TODO: Don't modify option
+ });
+
+ this.helper
+ .appendTo("body")
+ .disableSelection();
+
+ } else {
+ this.helper = this.element;
+ }
+
+ },
+
+ _change: {
+ e: function(event, dx, dy) {
+ return { width: this.originalSize.width + dx };
+ },
+ w: function(event, dx, dy) {
+ var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+ return { left: sp.left + dx, width: cs.width - dx };
+ },
+ n: function(event, dx, dy) {
+ var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+ return { top: sp.top + dy, height: cs.height - dy };
+ },
+ s: function(event, dx, dy) {
+ return { height: this.originalSize.height + dy };
+ },
+ se: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+ },
+ sw: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+ },
+ ne: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+ },
+ nw: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+ }
+ },
+
+ _propagate: function(n, event) {
+ $.ui.plugin.call(this, n, [event, this.ui()]);
+ (n != "resize" && this._trigger(n, event, this.ui()));
+ },
+
+ plugins: {},
+
+ ui: function() {
+ return {
+ originalElement: this.originalElement,
+ element: this.element,
+ helper: this.helper,
+ position: this.position,
+ size: this.size,
+ originalSize: this.originalSize,
+ originalPosition: this.originalPosition
+ };
+ }
+
+});
+
+$.extend($.ui.resizable, {
+ version: "1.8.10"
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+ start: function (event, ui) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var _store = function (exp) {
+ $(exp).each(function() {
+ var el = $(this);
+ el.data("resizable-alsoresize", {
+ width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
+ left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10),
+ position: el.css('position') // to reset Opera on stop()
+ });
+ });
+ };
+
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
+ if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
+ else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
+ }else{
+ _store(o.alsoResize);
+ }
+ },
+
+ resize: function (event, ui) {
+ var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+
+ var delta = {
+ height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
+ top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+ },
+
+ _alsoResize = function (exp, c) {
+ $(exp).each(function() {
+ var el = $(this), start = $(this).data("resizable-alsoresize"), style = {},
+ css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
+
+ $.each(css, function (i, prop) {
+ var sum = (start[prop]||0) + (delta[prop]||0);
+ if (sum && sum >= 0)
+ style[prop] = sum || null;
+ });
+
+ // Opera fixing relative position
+ if ($.browser.opera && /relative/.test(el.css('position'))) {
+ self._revertToRelativePosition = true;
+ el.css({ position: 'absolute', top: 'auto', left: 'auto' });
+ }
+
+ el.css(style);
+ });
+ };
+
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+ $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
+ }else{
+ _alsoResize(o.alsoResize);
+ }
+ },
+
+ stop: function (event, ui) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var _reset = function (exp) {
+ $(exp).each(function() {
+ var el = $(this);
+ // reset position for Opera - no need to verify it was changed
+ el.css({ position: el.data("resizable-alsoresize").position });
+ });
+ };
+
+ if (self._revertToRelativePosition) {
+ self._revertToRelativePosition = false;
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+ $.each(o.alsoResize, function (exp) { _reset(exp); });
+ }else{
+ _reset(o.alsoResize);
+ }
+ }
+
+ $(this).removeData("resizable-alsoresize");
+ }
+});
+
+$.ui.plugin.add("resizable", "animate", {
+
+ stop: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+ soffsetw = ista ? 0 : self.sizeDiff.width;
+
+ var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+ left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+ top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+ self.element.animate(
+ $.extend(style, top && left ? { top: top, left: left } : {}), {
+ duration: o.animateDuration,
+ easing: o.animateEasing,
+ step: function() {
+
+ var data = {
+ width: parseInt(self.element.css('width'), 10),
+ height: parseInt(self.element.css('height'), 10),
+ top: parseInt(self.element.css('top'), 10),
+ left: parseInt(self.element.css('left'), 10)
+ };
+
+ if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
+
+ // propagating resize, and updating values for each animation step
+ self._updateCache(data);
+ self._propagate("resize", event);
+
+ }
+ }
+ );
+ }
+
+});
+
+$.ui.plugin.add("resizable", "containment", {
+
+ start: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options, el = self.element;
+ var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
+ if (!ce) return;
+
+ self.containerElement = $(ce);
+
+ if (/document/.test(oc) || oc == document) {
+ self.containerOffset = { left: 0, top: 0 };
+ self.containerPosition = { left: 0, top: 0 };
+
+ self.parentData = {
+ element: $(document), left: 0, top: 0,
+ width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
+ };
+ }
+
+ // i'm a node, so compute top, left, right, bottom
+ else {
+ var element = $(ce), p = [];
+ $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
+
+ self.containerOffset = element.offset();
+ self.containerPosition = element.position();
+ self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+
+ var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width,
+ width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
+
+ self.parentData = {
+ element: ce, left: co.left, top: co.top, width: width, height: height
+ };
+ }
+ },
+
+ resize: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options,
+ ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
+ pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+
+ if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
+
+ if (cp.left < (self._helper ? co.left : 0)) {
+ self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
+ if (pRatio) self.size.height = self.size.width / o.aspectRatio;
+ self.position.left = o.helper ? co.left : 0;
+ }
+
+ if (cp.top < (self._helper ? co.top : 0)) {
+ self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
+ if (pRatio) self.size.width = self.size.height * o.aspectRatio;
+ self.position.top = self._helper ? co.top : 0;
+ }
+
+ self.offset.left = self.parentData.left+self.position.left;
+ self.offset.top = self.parentData.top+self.position.top;
+
+ var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
+ hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+
+ var isParent = self.containerElement.get(0) == self.element.parent().get(0),
+ isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+
+ if(isParent && isOffsetRelative) woset -= self.parentData.left;
+
+ if (woset + self.size.width >= self.parentData.width) {
+ self.size.width = self.parentData.width - woset;
+ if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+ }
+
+ if (hoset + self.size.height >= self.parentData.height) {
+ self.size.height = self.parentData.height - hoset;
+ if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+ }
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options, cp = self.position,
+ co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+
+ var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+
+ if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+ $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+ if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+ $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+ }
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+ start: function(event, ui) {
+
+ var self = $(this).data("resizable"), o = self.options, cs = self.size;
+
+ self.ghost = self.originalElement.clone();
+ self.ghost
+ .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
+ .addClass('ui-resizable-ghost')
+ .addClass(typeof o.ghost == 'string' ? o.ghost : '');
+
+ self.ghost.appendTo(self.helper);
+
+ },
+
+ resize: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options;
+ if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options;
+ if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+ }
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+ resize: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+ o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
+ var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
+
+ if (/^(se|s|e)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ }
+ else if (/^(ne)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.top = op.top - oy;
+ }
+ else if (/^(sw)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.left = op.left - ox;
+ }
+ else {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.top = op.top - oy;
+ self.position.left = op.left - ox;
+ }
+ }
+
+});
+
+var num = function(v) {
+ return parseInt(v, 10) || 0;
+};
+
+var isNumber = function(value) {
+ return !isNaN(parseInt(value, 10));
+};
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Selectable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.selectable", $.ui.mouse, {
+ options: {
+ appendTo: 'body',
+ autoRefresh: true,
+ distance: 0,
+ filter: '*',
+ tolerance: 'touch'
+ },
+ _create: function() {
+ var self = this;
+
+ this.element.addClass("ui-selectable");
+
+ this.dragged = false;
+
+ // cache selectee children based on filter
+ var selectees;
+ this.refresh = function() {
+ selectees = $(self.options.filter, self.element[0]);
+ selectees.each(function() {
+ var $this = $(this);
+ var pos = $this.offset();
+ $.data(this, "selectable-item", {
+ element: this,
+ $element: $this,
+ left: pos.left,
+ top: pos.top,
+ right: pos.left + $this.outerWidth(),
+ bottom: pos.top + $this.outerHeight(),
+ startselected: false,
+ selected: $this.hasClass('ui-selected'),
+ selecting: $this.hasClass('ui-selecting'),
+ unselecting: $this.hasClass('ui-unselecting')
+ });
+ });
+ };
+ this.refresh();
+
+ this.selectees = selectees.addClass("ui-selectee");
+
+ this._mouseInit();
+
+ this.helper = $("<div class='ui-selectable-helper'></div>");
+ },
+
+ destroy: function() {
+ this.selectees
+ .removeClass("ui-selectee")
+ .removeData("selectable-item");
+ this.element
+ .removeClass("ui-selectable ui-selectable-disabled")
+ .removeData("selectable")
+ .unbind(".selectable");
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseStart: function(event) {
+ var self = this;
+
+ this.opos = [event.pageX, event.pageY];
+
+ if (this.options.disabled)
+ return;
+
+ var options = this.options;
+
+ this.selectees = $(options.filter, this.element[0]);
+
+ this._trigger("start", event);
+
+ $(options.appendTo).append(this.helper);
+ // position helper (lasso)
+ this.helper.css({
+ "left": event.clientX,
+ "top": event.clientY,
+ "width": 0,
+ "height": 0
+ });
+
+ if (options.autoRefresh) {
+ this.refresh();
+ }
+
+ this.selectees.filter('.ui-selected').each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.startselected = true;
+ if (!event.metaKey) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ });
+
+ $(event.target).parents().andSelf().each(function() {
+ var selectee = $.data(this, "selectable-item");
+ if (selectee) {
+ var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
+ selectee.$element
+ .removeClass(doSelect ? "ui-unselecting" : "ui-selected")
+ .addClass(doSelect ? "ui-selecting" : "ui-unselecting");
+ selectee.unselecting = !doSelect;
+ selectee.selecting = doSelect;
+ selectee.selected = doSelect;
+ // selectable (UN)SELECTING callback
+ if (doSelect) {
+ self._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ } else {
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ return false;
+ }
+ });
+
+ },
+
+ _mouseDrag: function(event) {
+ var self = this;
+ this.dragged = true;
+
+ if (this.options.disabled)
+ return;
+
+ var options = this.options;
+
+ var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
+ if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
+ if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
+ this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
+
+ this.selectees.each(function() {
+ var selectee = $.data(this, "selectable-item");
+ //prevent helper from being selected if appendTo: selectable
+ if (!selectee || selectee.element == self.element[0])
+ return;
+ var hit = false;
+ if (options.tolerance == 'touch') {
+ hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
+ } else if (options.tolerance == 'fit') {
+ hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
+ }
+
+ if (hit) {
+ // SELECT
+ if (selectee.selected) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+ }
+ if (selectee.unselecting) {
+ selectee.$element.removeClass('ui-unselecting');
+ selectee.unselecting = false;
+ }
+ if (!selectee.selecting) {
+ selectee.$element.addClass('ui-selecting');
+ selectee.selecting = true;
+ // selectable SELECTING callback
+ self._trigger("selecting", event, {
+ selecting: selectee.element
+ });
+ }
+ } else {
+ // UNSELECT
+ if (selectee.selecting) {
+ if (event.metaKey && selectee.startselected) {
+ selectee.$element.removeClass('ui-selecting');
+ selectee.selecting = false;
+ selectee.$element.addClass('ui-selected');
+ selectee.selected = true;
+ } else {
+ selectee.$element.removeClass('ui-selecting');
+ selectee.selecting = false;
+ if (selectee.startselected) {
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ }
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ if (selectee.selected) {
+ if (!event.metaKey && !selectee.startselected) {
+ selectee.$element.removeClass('ui-selected');
+ selectee.selected = false;
+
+ selectee.$element.addClass('ui-unselecting');
+ selectee.unselecting = true;
+ // selectable UNSELECTING callback
+ self._trigger("unselecting", event, {
+ unselecting: selectee.element
+ });
+ }
+ }
+ }
+ });
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+ var self = this;
+
+ this.dragged = false;
+
+ var options = this.options;
+
+ $('.ui-unselecting', this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass('ui-unselecting');
+ selectee.unselecting = false;
+ selectee.startselected = false;
+ self._trigger("unselected", event, {
+ unselected: selectee.element
+ });
+ });
+ $('.ui-selecting', this.element[0]).each(function() {
+ var selectee = $.data(this, "selectable-item");
+ selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
+ selectee.selecting = false;
+ selectee.selected = true;
+ selectee.startselected = true;
+ self._trigger("selected", event, {
+ selected: selectee.element
+ });
+ });
+ this._trigger("stop", event);
+
+ this.helper.remove();
+
+ return false;
+ }
+
+});
+
+$.extend($.ui.selectable, {
+ version: "1.8.10"
+});
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Slider 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+// number of pages in a slider
+// (how many times can you page up/down to go through the whole range)
+var numPages = 5;
+
+$.widget( "ui.slider", $.ui.mouse, {
+
+ widgetEventPrefix: "slide",
+
+ options: {
+ animate: false,
+ distance: 0,
+ max: 100,
+ min: 0,
+ orientation: "horizontal",
+ range: false,
+ step: 1,
+ value: 0,
+ values: null
+ },
+
+ _create: function() {
+ var self = this,
+ o = this.options;
+
+ this._keySliding = false;
+ this._mouseSliding = false;
+ this._animateOff = true;
+ this._handleIndex = null;
+ this._detectOrientation();
+ this._mouseInit();
+
+ this.element
+ .addClass( "ui-slider" +
+ " ui-slider-" + this.orientation +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" );
+
+ if ( o.disabled ) {
+ this.element.addClass( "ui-slider-disabled ui-disabled" );
+ }
+
+ this.range = $([]);
+
+ if ( o.range ) {
+ if ( o.range === true ) {
+ this.range = $( "<div></div>" );
+ if ( !o.values ) {
+ o.values = [ this._valueMin(), this._valueMin() ];
+ }
+ if ( o.values.length && o.values.length !== 2 ) {
+ o.values = [ o.values[0], o.values[0] ];
+ }
+ } else {
+ this.range = $( "<div></div>" );
+ }
+
+ this.range
+ .appendTo( this.element )
+ .addClass( "ui-slider-range" );
+
+ if ( o.range === "min" || o.range === "max" ) {
+ this.range.addClass( "ui-slider-range-" + o.range );
+ }
+
+ // note: this isn't the most fittingly semantic framework class for this element,
+ // but worked best visually with a variety of themes
+ this.range.addClass( "ui-widget-header" );
+ }
+
+ if ( $( ".ui-slider-handle", this.element ).length === 0 ) {
+ $( "<a href='#'></a>" )
+ .appendTo( this.element )
+ .addClass( "ui-slider-handle" );
+ }
+
+ if ( o.values && o.values.length ) {
+ while ( $(".ui-slider-handle", this.element).length < o.values.length ) {
+ $( "<a href='#'></a>" )
+ .appendTo( this.element )
+ .addClass( "ui-slider-handle" );
+ }
+ }
+
+ this.handles = $( ".ui-slider-handle", this.element )
+ .addClass( "ui-state-default" +
+ " ui-corner-all" );
+
+ this.handle = this.handles.eq( 0 );
+
+ this.handles.add( this.range ).filter( "a" )
+ .click(function( event ) {
+ event.preventDefault();
+ })
+ .hover(function() {
+ if ( !o.disabled ) {
+ $( this ).addClass( "ui-state-hover" );
+ }
+ }, function() {
+ $( this ).removeClass( "ui-state-hover" );
+ })
+ .focus(function() {
+ if ( !o.disabled ) {
+ $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
+ $( this ).addClass( "ui-state-focus" );
+ } else {
+ $( this ).blur();
+ }
+ })
+ .blur(function() {
+ $( this ).removeClass( "ui-state-focus" );
+ });
+
+ this.handles.each(function( i ) {
+ $( this ).data( "index.ui-slider-handle", i );
+ });
+
+ this.handles
+ .keydown(function( event ) {
+ var ret = true,
+ index = $( this ).data( "index.ui-slider-handle" ),
+ allowed,
+ curVal,
+ newVal,
+ step;
+
+ if ( self.options.disabled ) {
+ return;
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ case $.ui.keyCode.END:
+ case $.ui.keyCode.PAGE_UP:
+ case $.ui.keyCode.PAGE_DOWN:
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ ret = false;
+ if ( !self._keySliding ) {
+ self._keySliding = true;
+ $( this ).addClass( "ui-state-active" );
+ allowed = self._start( event, index );
+ if ( allowed === false ) {
+ return;
+ }
+ }
+ break;
+ }
+
+ step = self.options.step;
+ if ( self.options.values && self.options.values.length ) {
+ curVal = newVal = self.values( index );
+ } else {
+ curVal = newVal = self.value();
+ }
+
+ switch ( event.keyCode ) {
+ case $.ui.keyCode.HOME:
+ newVal = self._valueMin();
+ break;
+ case $.ui.keyCode.END:
+ newVal = self._valueMax();
+ break;
+ case $.ui.keyCode.PAGE_UP:
+ newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
+ break;
+ case $.ui.keyCode.PAGE_DOWN:
+ newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
+ break;
+ case $.ui.keyCode.UP:
+ case $.ui.keyCode.RIGHT:
+ if ( curVal === self._valueMax() ) {
+ return;
+ }
+ newVal = self._trimAlignValue( curVal + step );
+ break;
+ case $.ui.keyCode.DOWN:
+ case $.ui.keyCode.LEFT:
+ if ( curVal === self._valueMin() ) {
+ return;
+ }
+ newVal = self._trimAlignValue( curVal - step );
+ break;
+ }
+
+ self._slide( event, index, newVal );
+
+ return ret;
+
+ })
+ .keyup(function( event ) {
+ var index = $( this ).data( "index.ui-slider-handle" );
+
+ if ( self._keySliding ) {
+ self._keySliding = false;
+ self._stop( event, index );
+ self._change( event, index );
+ $( this ).removeClass( "ui-state-active" );
+ }
+
+ });
+
+ this._refreshValue();
+
+ this._animateOff = false;
+ },
+
+ destroy: function() {
+ this.handles.remove();
+ this.range.remove();
+
+ this.element
+ .removeClass( "ui-slider" +
+ " ui-slider-horizontal" +
+ " ui-slider-vertical" +
+ " ui-slider-disabled" +
+ " ui-widget" +
+ " ui-widget-content" +
+ " ui-corner-all" )
+ .removeData( "slider" )
+ .unbind( ".slider" );
+
+ this._mouseDestroy();
+
+ return this;
+ },
+
+ _mouseCapture: function( event ) {
+ var o = this.options,
+ position,
+ normValue,
+ distance,
+ closestHandle,
+ self,
+ index,
+ allowed,
+ offset,
+ mouseOverHandle;
+
+ if ( o.disabled ) {
+ return false;
+ }
+
+ this.elementSize = {
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight()
+ };
+ this.elementOffset = this.element.offset();
+
+ position = { x: event.pageX, y: event.pageY };
+ normValue = this._normValueFromMouse( position );
+ distance = this._valueMax() - this._valueMin() + 1;
+ self = this;
+ this.handles.each(function( i ) {
+ var thisDistance = Math.abs( normValue - self.values(i) );
+ if ( distance > thisDistance ) {
+ distance = thisDistance;
+ closestHandle = $( this );
+ index = i;
+ }
+ });
+
+ // workaround for bug #3736 (if both handles of a range are at 0,
+ // the first is always used as the one with least distance,
+ // and moving it is obviously prevented by preventing negative ranges)
+ if( o.range === true && this.values(1) === o.min ) {
+ index += 1;
+ closestHandle = $( this.handles[index] );
+ }
+
+ allowed = this._start( event, index );
+ if ( allowed === false ) {
+ return false;
+ }
+ this._mouseSliding = true;
+
+ self._handleIndex = index;
+
+ closestHandle
+ .addClass( "ui-state-active" )
+ .focus();
+
+ offset = closestHandle.offset();
+ mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
+ this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
+ left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+ top: event.pageY - offset.top -
+ ( closestHandle.height() / 2 ) -
+ ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+ ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+ ( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
+ };
+
+ if ( !this.handles.hasClass( "ui-state-hover" ) ) {
+ this._slide( event, index, normValue );
+ }
+ this._animateOff = true;
+ return true;
+ },
+
+ _mouseStart: function( event ) {
+ return true;
+ },
+
+ _mouseDrag: function( event ) {
+ var position = { x: event.pageX, y: event.pageY },
+ normValue = this._normValueFromMouse( position );
+
+ this._slide( event, this._handleIndex, normValue );
+
+ return false;
+ },
+
+ _mouseStop: function( event ) {
+ this.handles.removeClass( "ui-state-active" );
+ this._mouseSliding = false;
+
+ this._stop( event, this._handleIndex );
+ this._change( event, this._handleIndex );
+
+ this._handleIndex = null;
+ this._clickOffset = null;
+ this._animateOff = false;
+
+ return false;
+ },
+
+ _detectOrientation: function() {
+ this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
+ },
+
+ _normValueFromMouse: function( position ) {
+ var pixelTotal,
+ pixelMouse,
+ percentMouse,
+ valueTotal,
+ valueMouse;
+
+ if ( this.orientation === "horizontal" ) {
+ pixelTotal = this.elementSize.width;
+ pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
+ } else {
+ pixelTotal = this.elementSize.height;
+ pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
+ }
+
+ percentMouse = ( pixelMouse / pixelTotal );
+ if ( percentMouse > 1 ) {
+ percentMouse = 1;
+ }
+ if ( percentMouse < 0 ) {
+ percentMouse = 0;
+ }
+ if ( this.orientation === "vertical" ) {
+ percentMouse = 1 - percentMouse;
+ }
+
+ valueTotal = this._valueMax() - this._valueMin();
+ valueMouse = this._valueMin() + percentMouse * valueTotal;
+
+ return this._trimAlignValue( valueMouse );
+ },
+
+ _start: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+ return this._trigger( "start", event, uiHash );
+ },
+
+ _slide: function( event, index, newVal ) {
+ var otherVal,
+ newValues,
+ allowed;
+
+ if ( this.options.values && this.options.values.length ) {
+ otherVal = this.values( index ? 0 : 1 );
+
+ if ( ( this.options.values.length === 2 && this.options.range === true ) &&
+ ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
+ ) {
+ newVal = otherVal;
+ }
+
+ if ( newVal !== this.values( index ) ) {
+ newValues = this.values();
+ newValues[ index ] = newVal;
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal,
+ values: newValues
+ } );
+ otherVal = this.values( index ? 0 : 1 );
+ if ( allowed !== false ) {
+ this.values( index, newVal, true );
+ }
+ }
+ } else {
+ if ( newVal !== this.value() ) {
+ // A slide can be canceled by returning false from the slide callback
+ allowed = this._trigger( "slide", event, {
+ handle: this.handles[ index ],
+ value: newVal
+ } );
+ if ( allowed !== false ) {
+ this.value( newVal );
+ }
+ }
+ }
+ },
+
+ _stop: function( event, index ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ this._trigger( "stop", event, uiHash );
+ },
+
+ _change: function( event, index ) {
+ if ( !this._keySliding && !this._mouseSliding ) {
+ var uiHash = {
+ handle: this.handles[ index ],
+ value: this.value()
+ };
+ if ( this.options.values && this.options.values.length ) {
+ uiHash.value = this.values( index );
+ uiHash.values = this.values();
+ }
+
+ this._trigger( "change", event, uiHash );
+ }
+ },
+
+ value: function( newValue ) {
+ if ( arguments.length ) {
+ this.options.value = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, 0 );
+ }
+
+ return this._value();
+ },
+
+ values: function( index, newValue ) {
+ var vals,
+ newValues,
+ i;
+
+ if ( arguments.length > 1 ) {
+ this.options.values[ index ] = this._trimAlignValue( newValue );
+ this._refreshValue();
+ this._change( null, index );
+ }
+
+ if ( arguments.length ) {
+ if ( $.isArray( arguments[ 0 ] ) ) {
+ vals = this.options.values;
+ newValues = arguments[ 0 ];
+ for ( i = 0; i < vals.length; i += 1 ) {
+ vals[ i ] = this._trimAlignValue( newValues[ i ] );
+ this._change( null, i );
+ }
+ this._refreshValue();
+ } else {
+ if ( this.options.values && this.options.values.length ) {
+ return this._values( index );
+ } else {
+ return this.value();
+ }
+ }
+ } else {
+ return this._values();
+ }
+ },
+
+ _setOption: function( key, value ) {
+ var i,
+ valsLength = 0;
+
+ if ( $.isArray( this.options.values ) ) {
+ valsLength = this.options.values.length;
+ }
+
+ $.Widget.prototype._setOption.apply( this, arguments );
+
+ switch ( key ) {
+ case "disabled":
+ if ( value ) {
+ this.handles.filter( ".ui-state-focus" ).blur();
+ this.handles.removeClass( "ui-state-hover" );
+ this.handles.attr( "disabled", "disabled" );
+ this.element.addClass( "ui-disabled" );
+ } else {
+ this.handles.removeAttr( "disabled" );
+ this.element.removeClass( "ui-disabled" );
+ }
+ break;
+ case "orientation":
+ this._detectOrientation();
+ this.element
+ .removeClass( "ui-slider-horizontal ui-slider-vertical" )
+ .addClass( "ui-slider-" + this.orientation );
+ this._refreshValue();
+ break;
+ case "value":
+ this._animateOff = true;
+ this._refreshValue();
+ this._change( null, 0 );
+ this._animateOff = false;
+ break;
+ case "values":
+ this._animateOff = true;
+ this._refreshValue();
+ for ( i = 0; i < valsLength; i += 1 ) {
+ this._change( null, i );
+ }
+ this._animateOff = false;
+ break;
+ }
+ },
+
+ //internal value getter
+ // _value() returns value trimmed by min and max, aligned by step
+ _value: function() {
+ var val = this.options.value;
+ val = this._trimAlignValue( val );
+
+ return val;
+ },
+
+ //internal values getter
+ // _values() returns array of values trimmed by min and max, aligned by step
+ // _values( index ) returns single value trimmed by min and max, aligned by step
+ _values: function( index ) {
+ var val,
+ vals,
+ i;
+
+ if ( arguments.length ) {
+ val = this.options.values[ index ];
+ val = this._trimAlignValue( val );
+
+ return val;
+ } else {
+ // .slice() creates a copy of the array
+ // this copy gets trimmed by min and max and then returned
+ vals = this.options.values.slice();
+ for ( i = 0; i < vals.length; i+= 1) {
+ vals[ i ] = this._trimAlignValue( vals[ i ] );
+ }
+
+ return vals;
+ }
+ },
+
+ // returns the step-aligned value that val is closest to, between (inclusive) min and max
+ _trimAlignValue: function( val ) {
+ if ( val <= this._valueMin() ) {
+ return this._valueMin();
+ }
+ if ( val >= this._valueMax() ) {
+ return this._valueMax();
+ }
+ var step = ( this.options.step > 0 ) ? this.options.step : 1,
+ valModStep = (val - this._valueMin()) % step;
+ alignValue = val - valModStep;
+
+ if ( Math.abs(valModStep) * 2 >= step ) {
+ alignValue += ( valModStep > 0 ) ? step : ( -step );
+ }
+
+ // Since JavaScript has problems with large floats, round
+ // the final value to 5 digits after the decimal point (see #4124)
+ return parseFloat( alignValue.toFixed(5) );
+ },
+
+ _valueMin: function() {
+ return this.options.min;
+ },
+
+ _valueMax: function() {
+ return this.options.max;
+ },
+
+ _refreshValue: function() {
+ var oRange = this.options.range,
+ o = this.options,
+ self = this,
+ animate = ( !this._animateOff ) ? o.animate : false,
+ valPercent,
+ _set = {},
+ lastValPercent,
+ value,
+ valueMin,
+ valueMax;
+
+ if ( this.options.values && this.options.values.length ) {
+ this.handles.each(function( i, j ) {
+ valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+ $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+ if ( self.options.range === true ) {
+ if ( self.orientation === "horizontal" ) {
+ if ( i === 0 ) {
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ } else {
+ if ( i === 0 ) {
+ self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+ }
+ if ( i === 1 ) {
+ self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ }
+ lastValPercent = valPercent;
+ });
+ } else {
+ value = this.value();
+ valueMin = this._valueMin();
+ valueMax = this._valueMax();
+ valPercent = ( valueMax !== valueMin ) ?
+ ( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+ 0;
+ _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+ this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+
+ if ( oRange === "min" && this.orientation === "horizontal" ) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "horizontal" ) {
+ this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ if ( oRange === "min" && this.orientation === "vertical" ) {
+ this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
+ }
+ if ( oRange === "max" && this.orientation === "vertical" ) {
+ this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+ }
+ }
+ }
+
+});
+
+$.extend( $.ui.slider, {
+ version: "1.8.10"
+});
+
+}(jQuery));
--- /dev/null
+/*
+ * jQuery UI Sortable 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.sortable", $.ui.mouse, {
+ widgetEventPrefix: "sort",
+ options: {
+ appendTo: "parent",
+ axis: false,
+ connectWith: false,
+ containment: false,
+ cursor: 'auto',
+ cursorAt: false,
+ dropOnEmpty: true,
+ forcePlaceholderSize: false,
+ forceHelperSize: false,
+ grid: false,
+ handle: false,
+ helper: "original",
+ items: '> *',
+ opacity: false,
+ placeholder: false,
+ revert: false,
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ scope: "default",
+ tolerance: "intersect",
+ zIndex: 1000
+ },
+ _create: function() {
+
+ var o = this.options;
+ this.containerCache = {};
+ this.element.addClass("ui-sortable");
+
+ //Get the items
+ this.refresh();
+
+ //Let's determine if the items are floating
+ this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) : false;
+
+ //Let's determine the parent's offset
+ this.offset = this.element.offset();
+
+ //Initialize mouse events for interaction
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+ this.element
+ .removeClass("ui-sortable ui-sortable-disabled")
+ .removeData("sortable")
+ .unbind(".sortable");
+ this._mouseDestroy();
+
+ for ( var i = this.items.length - 1; i >= 0; i-- )
+ this.items[i].item.removeData("sortable-item");
+
+ return this;
+ },
+
+ _setOption: function(key, value){
+ if ( key === "disabled" ) {
+ this.options[ key ] = value;
+
+ this.widget()
+ [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
+ } else {
+ // Don't call widget base _setOption for disable as it adds ui-state-disabled class
+ $.Widget.prototype._setOption.apply(this, arguments);
+ }
+ },
+
+ _mouseCapture: function(event, overrideHandle) {
+
+ if (this.reverting) {
+ return false;
+ }
+
+ if(this.options.disabled || this.options.type == 'static') return false;
+
+ //We have to refresh the items data once first
+ this._refreshItems(event);
+
+ //Find out if the clicked node (or one of its parents) is a actual item in this.items
+ var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
+ if($.data(this, 'sortable-item') == self) {
+ currentItem = $(this);
+ return false;
+ }
+ });
+ if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);
+
+ if(!currentItem) return false;
+ if(this.options.handle && !overrideHandle) {
+ var validHandle = false;
+
+ $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
+ if(!validHandle) return false;
+ }
+
+ this.currentItem = currentItem;
+ this._removeCurrentsFromItems();
+ return true;
+
+ },
+
+ _mouseStart: function(event, overrideHandle, noActivation) {
+
+ var o = this.options, self = this;
+ this.currentContainer = this;
+
+ //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
+ this.refreshPositions();
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Get the next scrolling parent
+ this.scrollParent = this.helper.scrollParent();
+
+ //The element's absolute position on the page minus margins
+ this.offset = this.currentItem.offset();
+ this.offset = {
+ top: this.offset.top - this.margins.top,
+ left: this.offset.left - this.margins.left
+ };
+
+ // Only after we got the offset, we can change the helper's position to absolute
+ // TODO: Still need to figure out a way to make relative sorting possible
+ this.helper.css("position", "absolute");
+ this.cssPosition = this.helper.css("position");
+
+ $.extend(this.offset, {
+ click: { //Where the click happened, relative to the element
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ },
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+ });
+
+ //Generate the original position
+ this.originalPosition = this._generatePosition(event);
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+ //Cache the former DOM position
+ this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
+
+ //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
+ if(this.helper[0] != this.currentItem[0]) {
+ this.currentItem.hide();
+ }
+
+ //Create the placeholder
+ this._createPlaceholder();
+
+ //Set a containment if given in the options
+ if(o.containment)
+ this._setContainment();
+
+ if(o.cursor) { // cursor option
+ if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
+ $('body').css("cursor", o.cursor);
+ }
+
+ if(o.opacity) { // opacity option
+ if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
+ this.helper.css("opacity", o.opacity);
+ }
+
+ if(o.zIndex) { // zIndex option
+ if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
+ this.helper.css("zIndex", o.zIndex);
+ }
+
+ //Prepare scrolling
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
+ this.overflowOffset = this.scrollParent.offset();
+
+ //Call callbacks
+ this._trigger("start", event, this._uiHash());
+
+ //Recache the helper size
+ if(!this._preserveHelperProportions)
+ this._cacheHelperProportions();
+
+
+ //Post 'activate' events to possible containers
+ if(!noActivation) {
+ for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
+ }
+
+ //Prepare possible droppables
+ if($.ui.ddmanager)
+ $.ui.ddmanager.current = this;
+
+ if ($.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+
+ this.dragging = true;
+
+ this.helper.addClass("ui-sortable-helper");
+ this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+ return true;
+
+ },
+
+ _mouseDrag: function(event) {
+
+ //Compute the helpers position
+ this.position = this._generatePosition(event);
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ if (!this.lastPositionAbs) {
+ this.lastPositionAbs = this.positionAbs;
+ }
+
+ //Do scrolling
+ if(this.options.scroll) {
+ var o = this.options, scrolled = false;
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
+
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
+ else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
+
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
+ else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
+
+ } else {
+
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+
+ }
+
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+ }
+
+ //Regenerate the absolute position used for position checks
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Set the helper position
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+
+ //Rearrange
+ for (var i = this.items.length - 1; i >= 0; i--) {
+
+ //Cache variables and intersection, continue if no intersection
+ var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
+ if (!intersection) continue;
+
+ if(itemElement != this.currentItem[0] //cannot intersect with itself
+ && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
+ && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
+ && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
+ //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
+ ) {
+
+ this.direction = intersection == 1 ? "down" : "up";
+
+ if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
+ this._rearrange(event, item);
+ } else {
+ break;
+ }
+
+ this._trigger("change", event, this._uiHash());
+ break;
+ }
+ }
+
+ //Post events to containers
+ this._contactContainers(event);
+
+ //Interconnect with droppables
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+ //Call callbacks
+ this._trigger('sort', event, this._uiHash());
+
+ this.lastPositionAbs = this.positionAbs;
+ return false;
+
+ },
+
+ _mouseStop: function(event, noPropagation) {
+
+ if(!event) return;
+
+ //If we are using droppables, inform the manager about the drop
+ if ($.ui.ddmanager && !this.options.dropBehaviour)
+ $.ui.ddmanager.drop(this, event);
+
+ if(this.options.revert) {
+ var self = this;
+ var cur = self.placeholder.offset();
+
+ self.reverting = true;
+
+ $(this.helper).animate({
+ left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
+ top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
+ }, parseInt(this.options.revert, 10) || 500, function() {
+ self._clear(event);
+ });
+ } else {
+ this._clear(event, noPropagation);
+ }
+
+ return false;
+
+ },
+
+ cancel: function() {
+
+ var self = this;
+
+ if(this.dragging) {
+
+ this._mouseUp({ target: null });
+
+ if(this.options.helper == "original")
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ else
+ this.currentItem.show();
+
+ //Post deactivating events to containers
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ this.containers[i]._trigger("deactivate", null, self._uiHash(this));
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", null, self._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ if (this.placeholder) {
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+ if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+ if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
+
+ $.extend(this, {
+ helper: null,
+ dragging: false,
+ reverting: false,
+ _noFinalSort: null
+ });
+
+ if(this.domPosition.prev) {
+ $(this.domPosition.prev).after(this.currentItem);
+ } else {
+ $(this.domPosition.parent).prepend(this.currentItem);
+ }
+ }
+
+ return this;
+
+ },
+
+ serialize: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected);
+ var str = []; o = o || {};
+
+ $(items).each(function() {
+ var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
+ if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
+ });
+
+ if(!str.length && o.key) {
+ str.push(o.key + '=');
+ }
+
+ return str.join('&');
+
+ },
+
+ toArray: function(o) {
+
+ var items = this._getItemsAsjQuery(o && o.connected);
+ var ret = []; o = o || {};
+
+ items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
+ return ret;
+
+ },
+
+ /* Be careful with the following core functions */
+ _intersectsWith: function(item) {
+
+ var x1 = this.positionAbs.left,
+ x2 = x1 + this.helperProportions.width,
+ y1 = this.positionAbs.top,
+ y2 = y1 + this.helperProportions.height;
+
+ var l = item.left,
+ r = l + item.width,
+ t = item.top,
+ b = t + item.height;
+
+ var dyClick = this.offset.click.top,
+ dxClick = this.offset.click.left;
+
+ var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
+
+ if( this.options.tolerance == "pointer"
+ || this.options.forcePointerForContainers
+ || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
+ ) {
+ return isOverElement;
+ } else {
+
+ return (l < x1 + (this.helperProportions.width / 2) // Right Half
+ && x2 - (this.helperProportions.width / 2) < r // Left Half
+ && t < y1 + (this.helperProportions.height / 2) // Bottom Half
+ && y2 - (this.helperProportions.height / 2) < b ); // Top Half
+
+ }
+ },
+
+ _intersectsWithPointer: function(item) {
+
+ var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+ isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+ isOverElement = isOverElementHeight && isOverElementWidth,
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (!isOverElement)
+ return false;
+
+ return this.floating ?
+ ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
+ : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
+
+ },
+
+ _intersectsWithSides: function(item) {
+
+ var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
+ isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
+ verticalDirection = this._getDragVerticalDirection(),
+ horizontalDirection = this._getDragHorizontalDirection();
+
+ if (this.floating && horizontalDirection) {
+ return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
+ } else {
+ return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
+ }
+
+ },
+
+ _getDragVerticalDirection: function() {
+ var delta = this.positionAbs.top - this.lastPositionAbs.top;
+ return delta != 0 && (delta > 0 ? "down" : "up");
+ },
+
+ _getDragHorizontalDirection: function() {
+ var delta = this.positionAbs.left - this.lastPositionAbs.left;
+ return delta != 0 && (delta > 0 ? "right" : "left");
+ },
+
+ refresh: function(event) {
+ this._refreshItems(event);
+ this.refreshPositions();
+ return this;
+ },
+
+ _connectWith: function() {
+ var options = this.options;
+ return options.connectWith.constructor == String
+ ? [options.connectWith]
+ : options.connectWith;
+ },
+
+ _getItemsAsjQuery: function(connected) {
+
+ var self = this;
+ var items = [];
+ var queries = [];
+ var connectWith = this._connectWith();
+
+ if(connectWith && connected) {
+ for (var i = connectWith.length - 1; i >= 0; i--){
+ var cur = $(connectWith[i]);
+ for (var j = cur.length - 1; j >= 0; j--){
+ var inst = $.data(cur[j], 'sortable');
+ if(inst && inst != this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
+ }
+ };
+ };
+ }
+
+ queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
+
+ for (var i = queries.length - 1; i >= 0; i--){
+ queries[i][0].each(function() {
+ items.push(this);
+ });
+ };
+
+ return $(items);
+
+ },
+
+ _removeCurrentsFromItems: function() {
+
+ var list = this.currentItem.find(":data(sortable-item)");
+
+ for (var i=0; i < this.items.length; i++) {
+
+ for (var j=0; j < list.length; j++) {
+ if(list[j] == this.items[i].item[0])
+ this.items.splice(i,1);
+ };
+
+ };
+
+ },
+
+ _refreshItems: function(event) {
+
+ this.items = [];
+ this.containers = [this];
+ var items = this.items;
+ var self = this;
+ var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
+ var connectWith = this._connectWith();
+
+ if(connectWith) {
+ for (var i = connectWith.length - 1; i >= 0; i--){
+ var cur = $(connectWith[i]);
+ for (var j = cur.length - 1; j >= 0; j--){
+ var inst = $.data(cur[j], 'sortable');
+ if(inst && inst != this && !inst.options.disabled) {
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
+ this.containers.push(inst);
+ }
+ };
+ };
+ }
+
+ for (var i = queries.length - 1; i >= 0; i--) {
+ var targetData = queries[i][1];
+ var _queries = queries[i][0];
+
+ for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
+ var item = $(_queries[j]);
+
+ item.data('sortable-item', targetData); // Data for target checking (mouse manager)
+
+ items.push({
+ item: item,
+ instance: targetData,
+ width: 0, height: 0,
+ left: 0, top: 0
+ });
+ };
+ };
+
+ },
+
+ refreshPositions: function(fast) {
+
+ //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
+ if(this.offsetParent && this.helper) {
+ this.offset.parent = this._getParentOffset();
+ }
+
+ for (var i = this.items.length - 1; i >= 0; i--){
+ var item = this.items[i];
+
+ var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
+
+ if (!fast) {
+ item.width = t.outerWidth();
+ item.height = t.outerHeight();
+ }
+
+ var p = t.offset();
+ item.left = p.left;
+ item.top = p.top;
+ };
+
+ if(this.options.custom && this.options.custom.refreshContainers) {
+ this.options.custom.refreshContainers.call(this);
+ } else {
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ var p = this.containers[i].element.offset();
+ this.containers[i].containerCache.left = p.left;
+ this.containers[i].containerCache.top = p.top;
+ this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
+ this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
+ };
+ }
+
+ return this;
+ },
+
+ _createPlaceholder: function(that) {
+
+ var self = that || this, o = self.options;
+
+ if(!o.placeholder || o.placeholder.constructor == String) {
+ var className = o.placeholder;
+ o.placeholder = {
+ element: function() {
+
+ var el = $(document.createElement(self.currentItem[0].nodeName))
+ .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
+ .removeClass("ui-sortable-helper")[0];
+
+ if(!className)
+ el.style.visibility = "hidden";
+
+ return el;
+ },
+ update: function(container, p) {
+
+ // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
+ if(className && !o.forcePlaceholderSize) return;
+
+ //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
+ if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
+ if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
+ }
+ };
+ }
+
+ //Create the placeholder
+ self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
+
+ //Append it after the actual current item
+ self.currentItem.after(self.placeholder);
+
+ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+ o.placeholder.update(self, self.placeholder);
+
+ },
+
+ _contactContainers: function(event) {
+
+ // get innermost container that intersects with item
+ var innermostContainer = null, innermostIndex = null;
+
+
+ for (var i = this.containers.length - 1; i >= 0; i--){
+
+ // never consider a container that's located within the item itself
+ if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
+ continue;
+
+ if(this._intersectsWith(this.containers[i].containerCache)) {
+
+ // if we've already found a container and it's more "inner" than this, then continue
+ if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
+ continue;
+
+ innermostContainer = this.containers[i];
+ innermostIndex = i;
+
+ } else {
+ // container doesn't intersect. trigger "out" event if necessary
+ if(this.containers[i].containerCache.over) {
+ this.containers[i]._trigger("out", event, this._uiHash(this));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ }
+
+ // if no intersecting containers found, return
+ if(!innermostContainer) return;
+
+ // move the item into the container if it's not there already
+ if(this.containers.length === 1) {
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ } else if(this.currentContainer != this.containers[innermostIndex]) {
+
+ //When entering a new container, we will find the item with the least distance and append our item near it
+ var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
+ for (var j = this.items.length - 1; j >= 0; j--) {
+ if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
+ var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top'];
+ if(Math.abs(cur - base) < dist) {
+ dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
+ }
+ }
+
+ if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
+ return;
+
+ this.currentContainer = this.containers[innermostIndex];
+ itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
+ this._trigger("change", event, this._uiHash());
+ this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
+
+ //Update the placeholder
+ this.options.placeholder.update(this.currentContainer, this.placeholder);
+
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+ this.containers[innermostIndex].containerCache.over = 1;
+ }
+
+
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options;
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
+
+ if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
+ $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+
+ if(helper[0] == this.currentItem[0])
+ this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
+
+ if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
+ if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
+
+ return helper;
+
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if (typeof obj == 'string') {
+ obj = obj.split(' ');
+ }
+ if ($.isArray(obj)) {
+ obj = {left: +obj[0], top: +obj[1] || 0};
+ }
+ if ('left' in obj) {
+ this.offset.click.left = obj.left + this.margins.left;
+ }
+ if ('right' in obj) {
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+ }
+ if ('top' in obj) {
+ this.offset.click.top = obj.top + this.margins.top;
+ }
+ if ('bottom' in obj) {
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+ }
+ },
+
+ _getParentOffset: function() {
+
+
+ //Get the offsetParent and cache its position
+ this.offsetParent = this.helper.offsetParent();
+ var po = this.offsetParent.offset();
+
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+ if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+ || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+ po = { top: 0, left: 0 };
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+
+ if(this.cssPosition == "relative") {
+ var p = this.currentItem.position();
+ return {
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+ };
+ } else {
+ return { top: 0, left: 0 };
+ }
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
+ top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var o = this.options;
+ if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+ if(o.containment == 'document' || o.containment == 'window') this.containment = [
+ 0 - this.offset.relative.left - this.offset.parent.left,
+ 0 - this.offset.relative.top - this.offset.parent.top,
+ $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+ ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+ ];
+
+ if(!(/^(document|window|parent)$/).test(o.containment)) {
+ var ce = $(o.containment)[0];
+ var co = $(o.containment).offset();
+ var over = ($(ce).css("overflow") != 'hidden');
+
+ this.containment = [
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+ ];
+ }
+
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if(!pos) pos = this.position;
+ var mod = d == "absolute" ? 1 : -1;
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ return {
+ top: (
+ pos.top // The absolute mouse position
+ + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+ ),
+ left: (
+ pos.left // The absolute mouse position
+ + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function(event) {
+
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ // This is another very weird special case that only happens for relative elements:
+ // 1. If the css position is relative
+ // 2. and the scroll parent is the document or similar to the offset parent
+ // we have to refresh the relative offset during the scroll so there are no jumps
+ if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
+ this.offset.relative = this._getRelativeOffset();
+ }
+
+ var pageX = event.pageX;
+ var pageY = event.pageY;
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+ if(this.containment) {
+ if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+ if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+ }
+
+ if(o.grid) {
+ var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+ pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+ var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+ pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ }
+
+ }
+
+ return {
+ top: (
+ pageY // The absolute mouse position
+ - this.offset.click.top // Click offset (relative to the element)
+ - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+ ),
+ left: (
+ pageX // The absolute mouse position
+ - this.offset.click.left // Click offset (relative to the element)
+ - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+ )
+ };
+
+ },
+
+ _rearrange: function(event, i, a, hardRefresh) {
+
+ a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
+
+ //Various things done here to improve the performance:
+ // 1. we create a setTimeout, that calls refreshPositions
+ // 2. on the instance, we have a counter variable, that get's higher after every append
+ // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
+ // 4. this lets only the last addition to the timeout stack through
+ this.counter = this.counter ? ++this.counter : 1;
+ var self = this, counter = this.counter;
+
+ window.setTimeout(function() {
+ if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
+ },0);
+
+ },
+
+ _clear: function(event, noPropagation) {
+
+ this.reverting = false;
+ // We delay all events that have to be triggered to after the point where the placeholder has been removed and
+ // everything else normalized again
+ var delayedTriggers = [], self = this;
+
+ // We first have to update the dom position of the actual currentItem
+ // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
+ if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem);
+ this._noFinalSort = null;
+
+ if(this.helper[0] == this.currentItem[0]) {
+ for(var i in this._storedCSS) {
+ if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
+ }
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+ } else {
+ this.currentItem.show();
+ }
+
+ if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
+ if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
+ if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
+ if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ }
+ };
+ };
+
+ //Post events to containers
+ for (var i = this.containers.length - 1; i >= 0; i--){
+ if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ if(this.containers[i].containerCache.over) {
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
+ this.containers[i].containerCache.over = 0;
+ }
+ }
+
+ //Do what was originally in plugins
+ if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
+ if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
+ if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
+
+ this.dragging = false;
+ if(this.cancelHelperRemoval) {
+ if(!noPropagation) {
+ this._trigger("beforeStop", event, this._uiHash());
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+ this._trigger("stop", event, this._uiHash());
+ }
+ return false;
+ }
+
+ if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
+
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+
+ if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
+
+ if(!noPropagation) {
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+ this._trigger("stop", event, this._uiHash());
+ }
+
+ this.fromOutside = false;
+ return true;
+
+ },
+
+ _trigger: function() {
+ if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
+ this.cancel();
+ }
+ },
+
+ _uiHash: function(inst) {
+ var self = inst || this;
+ return {
+ helper: self.helper,
+ placeholder: self.placeholder || $([]),
+ position: self.position,
+ originalPosition: self.originalPosition,
+ offset: self.positionAbs,
+ item: self.currentItem,
+ sender: inst ? inst.element : null
+ };
+ }
+
+});
+
+$.extend($.ui.sortable, {
+ version: "1.8.10"
+});
+
+})(jQuery);
--- /dev/null
+/*
+ * jQuery UI Tabs 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var tabId = 0,
+ listId = 0;
+
+function getNextTabId() {
+ return ++tabId;
+}
+
+function getNextListId() {
+ return ++listId;
+}
+
+$.widget( "ui.tabs", {
+ options: {
+ add: null,
+ ajaxOptions: null,
+ cache: false,
+ cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+ collapsible: false,
+ disable: null,
+ disabled: [],
+ enable: null,
+ event: "click",
+ fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
+ idPrefix: "ui-tabs-",
+ load: null,
+ panelTemplate: "<div></div>",
+ remove: null,
+ select: null,
+ show: null,
+ spinner: "<em>Loading…</em>",
+ tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
+ },
+
+ _create: function() {
+ this._tabify( true );
+ },
+
+ _setOption: function( key, value ) {
+ if ( key == "selected" ) {
+ if (this.options.collapsible && value == this.options.selected ) {
+ return;
+ }
+ this.select( value );
+ } else {
+ this.options[ key ] = value;
+ this._tabify();
+ }
+ },
+
+ _tabId: function( a ) {
+ return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) ||
+ this.options.idPrefix + getNextTabId();
+ },
+
+ _sanitizeSelector: function( hash ) {
+ // we need this because an id may contain a ":"
+ return hash.replace( /:/g, "\\:" );
+ },
+
+ _cookie: function() {
+ var cookie = this.cookie ||
+ ( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() );
+ return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) );
+ },
+
+ _ui: function( tab, panel ) {
+ return {
+ tab: tab,
+ panel: panel,
+ index: this.anchors.index( tab )
+ };
+ },
+
+ _cleanup: function() {
+ // restore all former loading tabs labels
+ this.lis.filter( ".ui-state-processing" )
+ .removeClass( "ui-state-processing" )
+ .find( "span:data(label.tabs)" )
+ .each(function() {
+ var el = $( this );
+ el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" );
+ });
+ },
+
+ _tabify: function( init ) {
+ var self = this,
+ o = this.options,
+ fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
+
+ this.list = this.element.find( "ol,ul" ).eq( 0 );
+ this.lis = $( " > li:has(a[href])", this.list );
+ this.anchors = this.lis.map(function() {
+ return $( "a", this )[ 0 ];
+ });
+ this.panels = $( [] );
+
+ this.anchors.each(function( i, a ) {
+ var href = $( a ).attr( "href" );
+ // For dynamically created HTML that contains a hash as href IE < 8 expands
+ // such href to the full page url with hash and then misinterprets tab as ajax.
+ // Same consideration applies for an added tab with a fragment identifier
+ // since a[href=#fragment-identifier] does unexpectedly not match.
+ // Thus normalize href attribute...
+ var hrefBase = href.split( "#" )[ 0 ],
+ baseEl;
+ if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
+ ( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
+ href = a.hash;
+ a.href = href;
+ }
+
+ // inline tab
+ if ( fragmentId.test( href ) ) {
+ self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) );
+ // remote tab
+ // prevent loading the page itself if href is just "#"
+ } else if ( href && href !== "#" ) {
+ // required for restore on destroy
+ $.data( a, "href.tabs", href );
+
+ // TODO until #3808 is fixed strip fragment identifier from url
+ // (IE fails to load from such url)
+ $.data( a, "load.tabs", href.replace( /#.*$/, "" ) );
+
+ var id = self._tabId( a );
+ a.href = "#" + id;
+ var $panel = self.element.find( "#" + id );
+ if ( !$panel.length ) {
+ $panel = $( o.panelTemplate )
+ .attr( "id", id )
+ .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+ .insertAfter( self.panels[ i - 1 ] || self.list );
+ $panel.data( "destroy.tabs", true );
+ }
+ self.panels = self.panels.add( $panel );
+ // invalid tab href
+ } else {
+ o.disabled.push( i );
+ }
+ });
+
+ // initialization from scratch
+ if ( init ) {
+ // attach necessary classes for styling
+ this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
+ this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+ this.lis.addClass( "ui-state-default ui-corner-top" );
+ this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
+
+ // Selected tab
+ // use "selected" option or try to retrieve:
+ // 1. from fragment identifier in url
+ // 2. from cookie
+ // 3. from selected class attribute on <li>
+ if ( o.selected === undefined ) {
+ if ( location.hash ) {
+ this.anchors.each(function( i, a ) {
+ if ( a.hash == location.hash ) {
+ o.selected = i;
+ return false;
+ }
+ });
+ }
+ if ( typeof o.selected !== "number" && o.cookie ) {
+ o.selected = parseInt( self._cookie(), 10 );
+ }
+ if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) {
+ o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+ }
+ o.selected = o.selected || ( this.lis.length ? 0 : -1 );
+ } else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release
+ o.selected = -1;
+ }
+
+ // sanity check - default to first tab...
+ o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 )
+ ? o.selected
+ : 0;
+
+ // Take disabling tabs via class attribute from HTML
+ // into account and update option properly.
+ // A selected tab cannot become disabled.
+ o.disabled = $.unique( o.disabled.concat(
+ $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
+ return self.lis.index( n );
+ })
+ ) ).sort();
+
+ if ( $.inArray( o.selected, o.disabled ) != -1 ) {
+ o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
+ }
+
+ // highlight selected tab
+ this.panels.addClass( "ui-tabs-hide" );
+ this.lis.removeClass( "ui-tabs-selected ui-state-active" );
+ // check for length avoids error when initializing empty list
+ if ( o.selected >= 0 && this.anchors.length ) {
+ self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" );
+ this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" );
+
+ // seems to be expected behavior that the show callback is fired
+ self.element.queue( "tabs", function() {
+ self._trigger( "show", null,
+ self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) );
+ });
+
+ this.load( o.selected );
+ }
+
+ // clean up to avoid memory leaks in certain versions of IE 6
+ // TODO: namespace this event
+ $( window ).bind( "unload", function() {
+ self.lis.add( self.anchors ).unbind( ".tabs" );
+ self.lis = self.anchors = self.panels = null;
+ });
+ // update selected after add/remove
+ } else {
+ o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+ }
+
+ // update collapsible
+ // TODO: use .toggleClass()
+ this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" );
+
+ // set or update cookie after init and add/remove respectively
+ if ( o.cookie ) {
+ this._cookie( o.selected, o.cookie );
+ }
+
+ // disable tabs
+ for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
+ $( li )[ $.inArray( i, o.disabled ) != -1 &&
+ // TODO: use .toggleClass()
+ !$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" );
+ }
+
+ // reset cache if switching from cached to not cached
+ if ( o.cache === false ) {
+ this.anchors.removeData( "cache.tabs" );
+ }
+
+ // remove all handlers before, tabify may run on existing tabs after add or option change
+ this.lis.add( this.anchors ).unbind( ".tabs" );
+
+ if ( o.event !== "mouseover" ) {
+ var addState = function( state, el ) {
+ if ( el.is( ":not(.ui-state-disabled)" ) ) {
+ el.addClass( "ui-state-" + state );
+ }
+ };
+ var removeState = function( state, el ) {
+ el.removeClass( "ui-state-" + state );
+ };
+ this.lis.bind( "mouseover.tabs" , function() {
+ addState( "hover", $( this ) );
+ });
+ this.lis.bind( "mouseout.tabs", function() {
+ removeState( "hover", $( this ) );
+ });
+ this.anchors.bind( "focus.tabs", function() {
+ addState( "focus", $( this ).closest( "li" ) );
+ });
+ this.anchors.bind( "blur.tabs", function() {
+ removeState( "focus", $( this ).closest( "li" ) );
+ });
+ }
+
+ // set up animations
+ var hideFx, showFx;
+ if ( o.fx ) {
+ if ( $.isArray( o.fx ) ) {
+ hideFx = o.fx[ 0 ];
+ showFx = o.fx[ 1 ];
+ } else {
+ hideFx = showFx = o.fx;
+ }
+ }
+
+ // Reset certain styles left over from animation
+ // and prevent IE's ClearType bug...
+ function resetStyle( $el, fx ) {
+ $el.css( "display", "" );
+ if ( !$.support.opacity && fx.opacity ) {
+ $el[ 0 ].style.removeAttribute( "filter" );
+ }
+ }
+
+ // Show a tab...
+ var showTab = showFx
+ ? function( clicked, $show ) {
+ $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+ $show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way
+ .animate( showFx, showFx.duration || "normal", function() {
+ resetStyle( $show, showFx );
+ self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+ });
+ }
+ : function( clicked, $show ) {
+ $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+ $show.removeClass( "ui-tabs-hide" );
+ self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+ };
+
+ // Hide a tab, $show is optional...
+ var hideTab = hideFx
+ ? function( clicked, $hide ) {
+ $hide.animate( hideFx, hideFx.duration || "normal", function() {
+ self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+ $hide.addClass( "ui-tabs-hide" );
+ resetStyle( $hide, hideFx );
+ self.element.dequeue( "tabs" );
+ });
+ }
+ : function( clicked, $hide, $show ) {
+ self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+ $hide.addClass( "ui-tabs-hide" );
+ self.element.dequeue( "tabs" );
+ };
+
+ // attach tab event handler, unbind to avoid duplicates from former tabifying...
+ this.anchors.bind( o.event + ".tabs", function() {
+ var el = this,
+ $li = $(el).closest( "li" ),
+ $hide = self.panels.filter( ":not(.ui-tabs-hide)" ),
+ $show = self.element.find( self._sanitizeSelector( el.hash ) );
+
+ // If tab is already selected and not collapsible or tab disabled or
+ // or is already loading or click callback returns false stop here.
+ // Check if click handler returns false last so that it is not executed
+ // for a disabled or loading tab!
+ if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) ||
+ $li.hasClass( "ui-state-disabled" ) ||
+ $li.hasClass( "ui-state-processing" ) ||
+ self.panels.filter( ":animated" ).length ||
+ self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) {
+ this.blur();
+ return false;
+ }
+
+ o.selected = self.anchors.index( this );
+
+ self.abort();
+
+ // if tab may be closed
+ if ( o.collapsible ) {
+ if ( $li.hasClass( "ui-tabs-selected" ) ) {
+ o.selected = -1;
+
+ if ( o.cookie ) {
+ self._cookie( o.selected, o.cookie );
+ }
+
+ self.element.queue( "tabs", function() {
+ hideTab( el, $hide );
+ }).dequeue( "tabs" );
+
+ this.blur();
+ return false;
+ } else if ( !$hide.length ) {
+ if ( o.cookie ) {
+ self._cookie( o.selected, o.cookie );
+ }
+
+ self.element.queue( "tabs", function() {
+ showTab( el, $show );
+ });
+
+ // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
+ self.load( self.anchors.index( this ) );
+
+ this.blur();
+ return false;
+ }
+ }
+
+ if ( o.cookie ) {
+ self._cookie( o.selected, o.cookie );
+ }
+
+ // show new tab
+ if ( $show.length ) {
+ if ( $hide.length ) {
+ self.element.queue( "tabs", function() {
+ hideTab( el, $hide );
+ });
+ }
+ self.element.queue( "tabs", function() {
+ showTab( el, $show );
+ });
+
+ self.load( self.anchors.index( this ) );
+ } else {
+ throw "jQuery UI Tabs: Mismatching fragment identifier.";
+ }
+
+ // Prevent IE from keeping other link focussed when using the back button
+ // and remove dotted border from clicked link. This is controlled via CSS
+ // in modern browsers; blur() removes focus from address bar in Firefox
+ // which can become a usability and annoying problem with tabs('rotate').
+ if ( $.browser.msie ) {
+ this.blur();
+ }
+ });
+
+ // disable click in any case
+ this.anchors.bind( "click.tabs", function(){
+ return false;
+ });
+ },
+
+ _getIndex: function( index ) {
+ // meta-function to give users option to provide a href string instead of a numerical index.
+ // also sanitizes numerical indexes to valid values.
+ if ( typeof index == "string" ) {
+ index = this.anchors.index( this.anchors.filter( "[href$=" + index + "]" ) );
+ }
+
+ return index;
+ },
+
+ destroy: function() {
+ var o = this.options;
+
+ this.abort();
+
+ this.element
+ .unbind( ".tabs" )
+ .removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" )
+ .removeData( "tabs" );
+
+ this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+
+ this.anchors.each(function() {
+ var href = $.data( this, "href.tabs" );
+ if ( href ) {
+ this.href = href;
+ }
+ var $this = $( this ).unbind( ".tabs" );
+ $.each( [ "href", "load", "cache" ], function( i, prefix ) {
+ $this.removeData( prefix + ".tabs" );
+ });
+ });
+
+ this.lis.unbind( ".tabs" ).add( this.panels ).each(function() {
+ if ( $.data( this, "destroy.tabs" ) ) {
+ $( this ).remove();
+ } else {
+ $( this ).removeClass([
+ "ui-state-default",
+ "ui-corner-top",
+ "ui-tabs-selected",
+ "ui-state-active",
+ "ui-state-hover",
+ "ui-state-focus",
+ "ui-state-disabled",
+ "ui-tabs-panel",
+ "ui-widget-content",
+ "ui-corner-bottom",
+ "ui-tabs-hide"
+ ].join( " " ) );
+ }
+ });
+
+ if ( o.cookie ) {
+ this._cookie( null, o.cookie );
+ }
+
+ return this;
+ },
+
+ add: function( url, label, index ) {
+ if ( index === undefined ) {
+ index = this.anchors.length;
+ }
+
+ var self = this,
+ o = this.options,
+ $li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ),
+ id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] );
+
+ $li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
+
+ // try to find an existing element before creating a new one
+ var $panel = self.element.find( "#" + id );
+ if ( !$panel.length ) {
+ $panel = $( o.panelTemplate )
+ .attr( "id", id )
+ .data( "destroy.tabs", true );
+ }
+ $panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
+
+ if ( index >= this.lis.length ) {
+ $li.appendTo( this.list );
+ $panel.appendTo( this.list[ 0 ].parentNode );
+ } else {
+ $li.insertBefore( this.lis[ index ] );
+ $panel.insertBefore( this.panels[ index ] );
+ }
+
+ o.disabled = $.map( o.disabled, function( n, i ) {
+ return n >= index ? ++n : n;
+ });
+
+ this._tabify();
+
+ if ( this.anchors.length == 1 ) {
+ o.selected = 0;
+ $li.addClass( "ui-tabs-selected ui-state-active" );
+ $panel.removeClass( "ui-tabs-hide" );
+ this.element.queue( "tabs", function() {
+ self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) );
+ });
+
+ this.load( 0 );
+ }
+
+ this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+ return this;
+ },
+
+ remove: function( index ) {
+ index = this._getIndex( index );
+ var o = this.options,
+ $li = this.lis.eq( index ).remove(),
+ $panel = this.panels.eq( index ).remove();
+
+ // If selected tab was removed focus tab to the right or
+ // in case the last tab was removed the tab to the left.
+ if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) {
+ this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
+ }
+
+ o.disabled = $.map(
+ $.grep( o.disabled, function(n, i) {
+ return n != index;
+ }),
+ function( n, i ) {
+ return n >= index ? --n : n;
+ });
+
+ this._tabify();
+
+ this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) );
+ return this;
+ },
+
+ enable: function( index ) {
+ index = this._getIndex( index );
+ var o = this.options;
+ if ( $.inArray( index, o.disabled ) == -1 ) {
+ return;
+ }
+
+ this.lis.eq( index ).removeClass( "ui-state-disabled" );
+ o.disabled = $.grep( o.disabled, function( n, i ) {
+ return n != index;
+ });
+
+ this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+ return this;
+ },
+
+ disable: function( index ) {
+ index = this._getIndex( index );
+ var self = this, o = this.options;
+ // cannot disable already selected tab
+ if ( index != o.selected ) {
+ this.lis.eq( index ).addClass( "ui-state-disabled" );
+
+ o.disabled.push( index );
+ o.disabled.sort();
+
+ this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+ }
+
+ return this;
+ },
+
+ select: function( index ) {
+ index = this._getIndex( index );
+ if ( index == -1 ) {
+ if ( this.options.collapsible && this.options.selected != -1 ) {
+ index = this.options.selected;
+ } else {
+ return this;
+ }
+ }
+ this.anchors.eq( index ).trigger( this.options.event + ".tabs" );
+ return this;
+ },
+
+ load: function( index ) {
+ index = this._getIndex( index );
+ var self = this,
+ o = this.options,
+ a = this.anchors.eq( index )[ 0 ],
+ url = $.data( a, "load.tabs" );
+
+ this.abort();
+
+ // not remote or from cache
+ if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) {
+ this.element.dequeue( "tabs" );
+ return;
+ }
+
+ // load remote from here on
+ this.lis.eq( index ).addClass( "ui-state-processing" );
+
+ if ( o.spinner ) {
+ var span = $( "span", a );
+ span.data( "label.tabs", span.html() ).html( o.spinner );
+ }
+
+ this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, {
+ url: url,
+ success: function( r, s ) {
+ self.element.find( self._sanitizeSelector( a.hash ) ).html( r );
+
+ // take care of tab labels
+ self._cleanup();
+
+ if ( o.cache ) {
+ $.data( a, "cache.tabs", true );
+ }
+
+ self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+ try {
+ o.ajaxOptions.success( r, s );
+ }
+ catch ( e ) {}
+ },
+ error: function( xhr, s, e ) {
+ // take care of tab labels
+ self._cleanup();
+
+ self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+ try {
+ // Passing index avoid a race condition when this method is
+ // called after the user has selected another tab.
+ // Pass the anchor that initiated this request allows
+ // loadError to manipulate the tab content panel via $(a.hash)
+ o.ajaxOptions.error( xhr, s, index, a );
+ }
+ catch ( e ) {}
+ }
+ } ) );
+
+ // last, so that load event is fired before show...
+ self.element.dequeue( "tabs" );
+
+ return this;
+ },
+
+ abort: function() {
+ // stop possibly running animations
+ this.element.queue( [] );
+ this.panels.stop( false, true );
+
+ // "tabs" queue must not contain more than two elements,
+ // which are the callbacks for the latest clicked tab...
+ this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
+
+ // terminate pending requests from other tabs
+ if ( this.xhr ) {
+ this.xhr.abort();
+ delete this.xhr;
+ }
+
+ // take care of tab labels
+ this._cleanup();
+ return this;
+ },
+
+ url: function( index, url ) {
+ this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url );
+ return this;
+ },
+
+ length: function() {
+ return this.anchors.length;
+ }
+});
+
+$.extend( $.ui.tabs, {
+ version: "1.8.10"
+});
+
+/*
+ * Tabs Extensions
+ */
+
+/*
+ * Rotate
+ */
+$.extend( $.ui.tabs.prototype, {
+ rotation: null,
+ rotate: function( ms, continuing ) {
+ var self = this,
+ o = this.options;
+
+ var rotate = self._rotate || ( self._rotate = function( e ) {
+ clearTimeout( self.rotation );
+ self.rotation = setTimeout(function() {
+ var t = o.selected;
+ self.select( ++t < self.anchors.length ? t : 0 );
+ }, ms );
+
+ if ( e ) {
+ e.stopPropagation();
+ }
+ });
+
+ var stop = self._unrotate || ( self._unrotate = !continuing
+ ? function(e) {
+ if (e.clientX) { // in case of a true click
+ self.rotate(null);
+ }
+ }
+ : function( e ) {
+ t = o.selected;
+ rotate();
+ });
+
+ // start rotation
+ if ( ms ) {
+ this.element.bind( "tabsshow", rotate );
+ this.anchors.bind( o.event + ".tabs", stop );
+ rotate();
+ // stop rotation
+ } else {
+ clearTimeout( self.rotation );
+ this.element.unbind( "tabsshow", rotate );
+ this.anchors.unbind( o.event + ".tabs", stop );
+ delete this._rotate;
+ delete this._unrotate;
+ }
+
+ return this;
+ }
+});
+
+})( jQuery );
--- /dev/null
+/*!
+ * jQuery UI Widget 1.8.10
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function( $, undefined ) {
+
+// jQuery 1.4+
+if ( $.cleanData ) {
+ var _cleanData = $.cleanData;
+ $.cleanData = function( elems ) {
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ $( elem ).triggerHandler( "remove" );
+ }
+ _cleanData( elems );
+ };
+} else {
+ var _remove = $.fn.remove;
+ $.fn.remove = function( selector, keepData ) {
+ return this.each(function() {
+ if ( !keepData ) {
+ if ( !selector || $.filter( selector, [ this ] ).length ) {
+ $( "*", this ).add( [ this ] ).each(function() {
+ $( this ).triggerHandler( "remove" );
+ });
+ }
+ }
+ return _remove.call( $(this), selector, keepData );
+ });
+ };
+}
+
+$.widget = function( name, base, prototype ) {
+ var namespace = name.split( "." )[ 0 ],
+ fullName;
+ name = name.split( "." )[ 1 ];
+ fullName = namespace + "-" + name;
+
+ if ( !prototype ) {
+ prototype = base;
+ base = $.Widget;
+ }
+
+ // create selector for plugin
+ $.expr[ ":" ][ fullName ] = function( elem ) {
+ return !!$.data( elem, name );
+ };
+
+ $[ namespace ] = $[ namespace ] || {};
+ $[ namespace ][ name ] = function( options, element ) {
+ // allow instantiation without initializing for simple inheritance
+ if ( arguments.length ) {
+ this._createWidget( options, element );
+ }
+ };
+
+ var basePrototype = new base();
+ // we need to make the options hash a property directly on the new instance
+ // otherwise we'll modify the options hash on the prototype that we're
+ // inheriting from
+// $.each( basePrototype, function( key, val ) {
+// if ( $.isPlainObject(val) ) {
+// basePrototype[ key ] = $.extend( {}, val );
+// }
+// });
+ basePrototype.options = $.extend( true, {}, basePrototype.options );
+ $[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+ namespace: namespace,
+ widgetName: name,
+ widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
+ widgetBaseClass: fullName
+ }, prototype );
+
+ $.widget.bridge( name, $[ namespace ][ name ] );
+};
+
+$.widget.bridge = function( name, object ) {
+ $.fn[ name ] = function( options ) {
+ var isMethodCall = typeof options === "string",
+ args = Array.prototype.slice.call( arguments, 1 ),
+ returnValue = this;
+
+ // allow multiple hashes to be passed on init
+ options = !isMethodCall && args.length ?
+ $.extend.apply( null, [ true, options ].concat(args) ) :
+ options;
+
+ // prevent calls to internal methods
+ if ( isMethodCall && options.charAt( 0 ) === "_" ) {
+ return returnValue;
+ }
+
+ if ( isMethodCall ) {
+ this.each(function() {
+ var instance = $.data( this, name ),
+ methodValue = instance && $.isFunction( instance[options] ) ?
+ instance[ options ].apply( instance, args ) :
+ instance;
+ // TODO: add this back in 1.9 and use $.error() (see #5972)
+// if ( !instance ) {
+// throw "cannot call methods on " + name + " prior to initialization; " +
+// "attempted to call method '" + options + "'";
+// }
+// if ( !$.isFunction( instance[options] ) ) {
+// throw "no such method '" + options + "' for " + name + " widget instance";
+// }
+// var methodValue = instance[ options ].apply( instance, args );
+ if ( methodValue !== instance && methodValue !== undefined ) {
+ returnValue = methodValue;
+ return false;
+ }
+ });
+ } else {
+ this.each(function() {
+ var instance = $.data( this, name );
+ if ( instance ) {
+ instance.option( options || {} )._init();
+ } else {
+ $.data( this, name, new object( options, this ) );
+ }
+ });
+ }
+
+ return returnValue;
+ };
+};
+
+$.Widget = function( options, element ) {
+ // allow instantiation without initializing for simple inheritance
+ if ( arguments.length ) {
+ this._createWidget( options, element );
+ }
+};
+
+$.Widget.prototype = {
+ widgetName: "widget",
+ widgetEventPrefix: "",
+ options: {
+ disabled: false
+ },
+ _createWidget: function( options, element ) {
+ // $.widget.bridge stores the plugin instance, but we do it anyway
+ // so that it's stored even before the _create function runs
+ $.data( element, this.widgetName, this );
+ this.element = $( element );
+ this.options = $.extend( true, {},
+ this.options,
+ this._getCreateOptions(),
+ options );
+
+ var self = this;
+ this.element.bind( "remove." + this.widgetName, function() {
+ self.destroy();
+ });
+
+ this._create();
+ this._trigger( "create" );
+ this._init();
+ },
+ _getCreateOptions: function() {
+ return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+ },
+ _create: function() {},
+ _init: function() {},
+
+ destroy: function() {
+ this.element
+ .unbind( "." + this.widgetName )
+ .removeData( this.widgetName );
+ this.widget()
+ .unbind( "." + this.widgetName )
+ .removeAttr( "aria-disabled" )
+ .removeClass(
+ this.widgetBaseClass + "-disabled " +
+ "ui-state-disabled" );
+ },
+
+ widget: function() {
+ return this.element;
+ },
+
+ option: function( key, value ) {
+ var options = key;
+
+ if ( arguments.length === 0 ) {
+ // don't return a reference to the internal hash
+ return $.extend( {}, this.options );
+ }
+
+ if (typeof key === "string" ) {
+ if ( value === undefined ) {
+ return this.options[ key ];
+ }
+ options = {};
+ options[ key ] = value;
+ }
+
+ this._setOptions( options );
+
+ return this;
+ },
+ _setOptions: function( options ) {
+ var self = this;
+ $.each( options, function( key, value ) {
+ self._setOption( key, value );
+ });
+
+ return this;
+ },
+ _setOption: function( key, value ) {
+ this.options[ key ] = value;
+
+ if ( key === "disabled" ) {
+ this.widget()
+ [ value ? "addClass" : "removeClass"](
+ this.widgetBaseClass + "-disabled" + " " +
+ "ui-state-disabled" )
+ .attr( "aria-disabled", value );
+ }
+
+ return this;
+ },
+
+ enable: function() {
+ return this._setOption( "disabled", false );
+ },
+ disable: function() {
+ return this._setOption( "disabled", true );
+ },
+
+ _trigger: function( type, event, data ) {
+ var callback = this.options[ type ];
+
+ event = $.Event( event );
+ event.type = ( type === this.widgetEventPrefix ?
+ type :
+ this.widgetEventPrefix + type ).toLowerCase();
+ data = data || {};
+
+ // copy original event properties over to the new event
+ // this would happen if we could call $.event.fix instead of $.Event
+ // but we don't have a way to force an event to be fixed multiple times
+ if ( event.originalEvent ) {
+ for ( var i = $.event.props.length, prop; i; ) {
+ prop = $.event.props[ --i ];
+ event[ prop ] = event.originalEvent[ prop ];
+ }
+ }
+
+ this.element.trigger( event, data );
+
+ return !( $.isFunction(callback) &&
+ callback.call( this.element[0], event, data ) === false ||
+ event.isDefaultPrevented() );
+ }
+};
+
+})( jQuery );
.attr(SN.C.S.Disabled, SN.C.S.Disabled);
},
error: function (xhr, textStatus, errorThrown) {
- alert(errorThrown || textStatus);
+ // If the server end reported an error from StatusNet,
+ // find it -- otherwise we'll see what was reported
+ // from the browser.
+ var errorReported = null;
+ if (xhr.responseXML) {
+ errorReported = $('#error', xhr.responseXML).text();
+ }
+ alert(errorReported || errorThrown || textStatus);
+
+ // Restore the form to original state.
+ // Hopefully. :D
+ form
+ .removeClass(SN.C.S.Processing)
+ .find('.submit')
+ .removeClass(SN.C.S.Disabled)
+ .removeAttr(SN.C.S.Disabled);
},
success: function(data, textStatus) {
if (typeof($('form', data)[0]) != 'undefined') {
form_new = document._importNode($('form', data)[0], true);
form.replaceWith(form_new);
}
- else {
+ else if (typeof($('p', data)[0]) != 'undefined') {
form.replaceWith(document._importNode($('p', data)[0], true));
}
+ else {
+ alert('Unknown error.');
+ }
}
});
},
.css({display:'none'})
.fadeIn(2500);
SN.U.NoticeWithAttachment($('#'+notice.id));
- SN.U.NoticeReplyTo($('#'+notice.id));
SN.U.switchInputFormTab("placeholder");
}
} else {
* @access private
*/
NoticeReply: function() {
- if ($('#content .notice_reply').length > 0) {
- $('#content .notice').each(function() { SN.U.NoticeReplyTo($(this)); });
- }
+ $('#content .notice_reply').live('click', function(e) {
+ e.preventDefault();
+ var notice = $(this).closest('li.notice');
+ var nickname = ($('.author .nickname', notice).length > 0) ? $($('.author .nickname', notice)[0]) : $('.author .nickname.uid');
+ SN.U.NoticeInlineReplyTrigger(notice, '@' + nickname.text());
+ return false;
+ });
},
/**
- * Setup function -- DOES NOT trigger actions immediately.
- *
- * Sets up event handlers on the given notice's reply button to
- * tweak the new-notice form with needed variables and focus it
- * when pushed.
- *
- * (This replaces the default reply button behavior to submit
- * directly to a form which comes back with a specialized page
- * with the form data prefilled.)
- *
- * @param {jQuery} notice: jQuery object containing one or more notices
+ * Stub -- kept for compat with plugins for now.
* @access private
*/
NoticeReplyTo: function(notice) {
- notice.find('.notice_reply').live('click', function(e) {
- e.preventDefault();
- var nickname = ($('.author .nickname', notice).length > 0) ? $($('.author .nickname', notice)[0]) : $('.author .nickname.uid');
- SN.U.NoticeInlineReplyTrigger(notice, '@' + nickname.text());
- return false;
- });
},
/**
'<input class="placeholder">' +
'</li>');
placeholder.find('input')
- .val(SN.msg('reply_placeholder'))
- .focus(function() {
- SN.U.NoticeInlineReplyTrigger(notice);
- return false;
- });
+ .val(SN.msg('reply_placeholder'));
list.append(placeholder);
},
/**
* Setup function -- DOES NOT apply immediately.
*
- * Sets up event handlers for favor/disfavor forms to submit via XHR.
+ * Sets up event handlers for inline reply mini-form placeholders.
* Uses 'live' rather than 'bind', so applies to future as well as present items.
*/
NoticeInlineReplySetup: function() {
- $('.threaded-replies').each(function() {
- var list = $(this);
- var notice = list.closest('.notice');
- SN.U.NoticeInlineReplyPlaceholder(notice);
- });
+ $('li.notice-reply-placeholder input')
+ .live('focus', function() {
+ var notice = $(this).closest('li.notice');
+ SN.U.NoticeInlineReplyTrigger(notice);
+ return false;
+ });
},
/**
-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(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(".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 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));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(){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(h,i){var b=$($(".notice_id",h)[0]).text();var e=h;var f=h.closest(".notices");if(f.hasClass("threaded-replies")){e=f.closest(".notice")}else{f=$("ul.threaded-replies",h);if(f.length==0){f=$('<ul class="notices threaded-replies xoxo"></ul>');h.append(f)}}var j=$(".notice-reply-form",f);var d=function(){j.find("input[name=inreplyto]").val(b);var m=j.find("textarea");if(m.length==0){throw"No textarea"}var l="";if(i){l=i+" "}m.val(l+m.val().replace(RegExp(l,"i"),""));m.data("initialText",$.trim(i+""));m.focus();if(m[0].setSelectionRange){var k=m.val().length;m[0].setSelectionRange(k,k)}};if(j.length>0){d()}else{f.find("li.notice-reply-placeholder").remove();var g=$("li.notice-reply",f);if(g.length==0){g=$('<li class="notice-reply"></li>');var c=function(k){var l=document._importNode(k,true);g.append(l);f.append(g);var m=j=$(l);SN.Init.NoticeFormSetup(m);d()};if(SN.C.I.NoticeFormMaster){c(SN.C.I.NoticeFormMaster)}else{var a=$("#form_notice").attr("action");$.get(a,{ajax:1},function(k,m,l){c($("form",k)[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")).focus(function(){SN.U.NoticeInlineReplyTrigger(b);return false});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">×</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">×</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">×</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">×</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();SN.U.NoticeInlineReplyPlaceholder(e)}}})}})}},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()})()};
\ 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],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 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.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(h,i){var b=$($(".notice_id",h)[0]).text();var e=h;var f=h.closest(".notices");if(f.hasClass("threaded-replies")){e=f.closest(".notice")}else{f=$("ul.threaded-replies",h);if(f.length==0){f=$('<ul class="notices threaded-replies xoxo"></ul>');h.append(f)}}var j=$(".notice-reply-form",f);var d=function(){j.find("input[name=inreplyto]").val(b);var m=j.find("textarea");if(m.length==0){throw"No textarea"}var l="";if(i){l=i+" "}m.val(l+m.val().replace(RegExp(l,"i"),""));m.data("initialText",$.trim(i+""));m.focus();if(m[0].setSelectionRange){var k=m.val().length;m[0].setSelectionRange(k,k)}};if(j.length>0){d()}else{f.find("li.notice-reply-placeholder").remove();var g=$("li.notice-reply",f);if(g.length==0){g=$('<li class="notice-reply"></li>');var c=function(k){var l=document._importNode(k,true);g.append(l);f.append(g);var m=j=$(l);SN.Init.NoticeFormSetup(m);d()};if(SN.C.I.NoticeFormMaster){c(SN.C.I.NoticeFormMaster)}else{var a=$("#form_notice").attr("action");$.get(a,{ajax:1},function(k,m,l){c($("form",k)[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})},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">×</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">×</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">×</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">×</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();SN.U.NoticeInlineReplyPlaceholder(e)}}})}})}},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()})()};
\ No newline at end of file
--- /dev/null
+<?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'));
+ }
+}
\ No newline at end of file
function prepare($argarray)
{
$this->args =& common_copy_args($argarray);
+
+ if ($this->boolean('ajax')) {
+ StatusNet::setAjax(true);
+ }
+
return true;
}
{
if (Event::handle('StartShowHTML', array($this))) {
$this->startHTML();
+ $this->flush();
Event::handle('EndShowHTML', array($this));
}
if (Event::handle('StartShowHead', array($this))) {
$this->showHead();
+ $this->flush();
Event::handle('EndShowHead', array($this));
}
if (Event::handle('StartShowBody', array($this))) {
Event::handle('EndShowLaconicaStyles', array($this));
}
+ $this->cssLink(common_path('js/css/smoothness/jquery-ui.css'));
+
if (Event::handle('StartShowUAStyles', array($this))) {
$this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
'href="'.Theme::path('css/ie.css', 'base').'?version='.STATUSNET_VERSION.'" /><![endif]');
{
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');
+ 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->elementStart('div', array('id' => 'wrap'));
if (Event::handle('StartShowHeader', array($this))) {
$this->showHeader();
+ $this->flush();
Event::handle('EndShowHeader', array($this));
}
$this->showCore();
+ $this->flush();
if (Event::handle('StartShowFooter', array($this))) {
$this->showFooter();
+ $this->flush();
Event::handle('EndShowFooter', array($this));
}
$this->elementEnd('div');
function showCore()
{
$this->elementStart('div', array('id' => 'core'));
+ $this->elementStart('div', array('id' => 'aside_primary_wrapper'));
+ $this->elementStart('div', array('id' => 'content_wrapper'));
+ $this->elementStart('div', array('id' => 'site_nav_local_views_wrapper'));
if (Event::handle('StartShowLocalNavBlock', array($this))) {
$this->showLocalNavBlock();
+ $this->flush();
Event::handle('EndShowLocalNavBlock', array($this));
}
if (Event::handle('StartShowContentBlock', array($this))) {
$this->showContentBlock();
+ $this->flush();
Event::handle('EndShowContentBlock', array($this));
}
if (Event::handle('StartShowAside', array($this))) {
$this->showAside();
+ $this->flush();
Event::handle('EndShowAside', array($this));
}
$this->elementEnd('div');
+ $this->elementEnd('div');
+ $this->elementEnd('div');
+ $this->elementEnd('div');
}
/**
// Need to have this ID for CSS; I'm too lazy to add it to
// all menus
$this->elementStart('div', array('id' => 'site_nav_local_views'));
+ // Cheat cheat cheat!
$this->showLocalNav();
$this->elementEnd('div');
}
+ /**
+ * If there's a logged-in user, show a bit of login context
+ *
+ * @return nothing
+ */
+
+ function showProfileBlock()
+ {
+ if (common_logged_in()) {
+ $block = new DefaultProfileBlock($this);
+ $block->show();
+ }
+ }
+
/**
* Show local navigation.
*
{
$this->elementStart('div', array('id' => 'aside_primary',
'class' => 'aside'));
+ $this->showProfileBlock();
if (Event::handle('StartShowObjectNavBlock', array($this))) {
$this->showObjectNavBlock();
Event::handle('EndShowObjectNavBlock', array($this));
$xo->elementStart($tag);
}
- $xo->element('activity:object-type', null, $this->type);
+ if (Event::handle('StartActivityObjectOutputAtom', array($this, $xo))) {
+ $xo->element('activity:object-type', null, $this->type);
- // <author> uses URI
+ // <author> uses URI
- if ($tag == 'author') {
- $xo->element(self::URI, null, $this->id);
- } else {
- $xo->element(self::ID, null, $this->id);
- }
-
- if (!empty($this->title)) {
- $name = common_xml_safe_str($this->title);
if ($tag == 'author') {
- // XXX: Backward compatibility hack -- atom:name should contain
- // full name here, instead of nickname, i.e.: $name. Change
- // this in the next version.
- $xo->element(self::NAME, null, $this->poco->preferredUsername);
+ $xo->element(self::URI, null, $this->id);
} else {
- $xo->element(self::TITLE, null, $name);
+ $xo->element(self::ID, null, $this->id);
}
- }
-
- if (!empty($this->summary)) {
- $xo->element(
- self::SUMMARY,
- null,
- common_xml_safe_str($this->summary)
- );
- }
- if (!empty($this->content)) {
- // XXX: assuming HTML content here
- $xo->element(
- ActivityUtils::CONTENT,
- array('type' => 'html'),
- common_xml_safe_str($this->content)
- );
- }
+ if (!empty($this->title)) {
+ $name = common_xml_safe_str($this->title);
+ if ($tag == 'author') {
+ // XXX: Backward compatibility hack -- atom:name should contain
+ // full name here, instead of nickname, i.e.: $name. Change
+ // this in the next version.
+ $xo->element(self::NAME, null, $this->poco->preferredUsername);
+ } else {
+ $xo->element(self::TITLE, null, $name);
+ }
+ }
- if (!empty($this->link)) {
- $xo->element(
- 'link',
- array(
- 'rel' => 'alternate',
- 'type' => 'text/html',
- 'href' => $this->link
- ),
- null
- );
- }
+ if (!empty($this->summary)) {
+ $xo->element(
+ self::SUMMARY,
+ null,
+ common_xml_safe_str($this->summary)
+ );
+ }
- if ($this->type == ActivityObject::PERSON
- || $this->type == ActivityObject::GROUP) {
+ if (!empty($this->content)) {
+ // XXX: assuming HTML content here
+ $xo->element(
+ ActivityUtils::CONTENT,
+ array('type' => 'html'),
+ common_xml_safe_str($this->content)
+ );
+ }
- foreach ($this->avatarLinks as $avatar) {
+ if (!empty($this->link)) {
$xo->element(
- 'link', array(
- 'rel' => 'avatar',
- 'type' => $avatar->type,
- 'media:width' => $avatar->width,
- 'media:height' => $avatar->height,
- 'href' => $avatar->url
+ 'link',
+ array(
+ 'rel' => 'alternate',
+ 'type' => 'text/html',
+ 'href' => $this->link
),
null
);
}
- }
- 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);
- }
+ 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);
+ }
- // @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)) {
{
$object = array();
- // XXX: attachedObjects are added by Activity
+ if (Event::handle('StartActivityObjectOutputJson', array($this, &$object))) {
+ // XXX: attachedObjects are added by Activity
- // displayName
- $object['displayName'] = $this->title;
+ // displayName
+ $object['displayName'] = $this->title;
- // TODO: downstreamDuplicates
+ // TODO: downstreamDuplicates
- // embedCode (used for video)
+ // embedCode (used for video)
- // id
- //
- // XXX: Should we use URL here? or a crazy tag URI?
- $object['id'] = $this->id;
+ // id
+ //
+ // XXX: Should we use URL here? or a crazy tag URI?
+ $object['id'] = $this->id;
- if ($this->type == ActivityObject::PERSON
- || $this->type == ActivityObject::GROUP) {
+ if ($this->type == ActivityObject::PERSON
+ || $this->type == ActivityObject::GROUP) {
- // XXX: Not sure what the best avatar is to use for the
- // author's "image". For now, I'm using the large size.
+ // XXX: Not sure what the best avatar is to use for the
+ // author's "image". For now, I'm using the large size.
- $avatarLarge = null;
- $avatarMediaLinks = array();
+ $avatarLarge = null;
+ $avatarMediaLinks = array();
- foreach ($this->avatarLinks as $a) {
+ foreach ($this->avatarLinks as $a) {
- // Make a MediaLink for every other Avatar
- $avatar = new ActivityStreamsMediaLink(
- $a->url,
- $a->width,
- $a->height,
- $a->type,
- 'avatar'
- );
+ // Make a MediaLink for every other Avatar
+ $avatar = new ActivityStreamsMediaLink(
+ $a->url,
+ $a->width,
+ $a->height,
+ $a->type,
+ 'avatar'
+ );
- // Find the big avatar to use as the "image"
- if ($a->height == AVATAR_PROFILE_SIZE) {
- $imgLink = $avatar;
- }
+ // Find the big avatar to use as the "image"
+ if ($a->height == AVATAR_PROFILE_SIZE) {
+ $imgLink = $avatar;
+ }
- $avatarMediaLinks[] = $avatar->asArray();
- }
+ $avatarMediaLinks[] = $avatar->asArray();
+ }
- $object['avatarLinks'] = $avatarMediaLinks; // extension
+ $object['avatarLinks'] = $avatarMediaLinks; // extension
- // image
- $object['image'] = $imgLink->asArray();
- }
+ // image
+ $object['image'] = $imgLink->asArray();
+ }
- // objectType
- //
- // We can probably use the whole schema URL here but probably the
- // relative simple name is easier to parse
- // @fixme this breaks extension URIs
- $object['type'] = substr($this->type, strrpos($this->type, '/') + 1);
+ // objectType
+ //
+ // We can probably use the whole schema URL here but probably the
+ // relative simple name is easier to parse
+ // @fixme this breaks extension URIs
+ $object['type'] = substr($this->type, strrpos($this->type, '/') + 1);
- // summary
- $object['summary'] = $this->summary;
+ // summary
+ $object['summary'] = $this->summary;
- // TODO: upstreamDuplicates
+ // TODO: upstreamDuplicates
- // url (XXX: need to put the right thing here...)
- $object['url'] = $this->id;
+ // url (XXX: need to put the right thing here...)
+ $object['url'] = $this->id;
- /* Extensions */
- // @fixme these may collide with XML extensions
- // @fixme multiple tags of same name will overwrite each other
- // @fixme text content from XML extensions will be lost
- foreach ($this->extra as $e) {
- list($objectName, $props, $txt) = $e;
- $object[$objectName] = $props;
- }
+ /* Extensions */
+ // @fixme these may collide with XML extensions
+ // @fixme multiple tags of same name will overwrite each other
+ // @fixme text content from XML extensions will be lost
+ foreach ($this->extra as $e) {
+ list($objectName, $props, $txt) = $e;
+ $object[$objectName] = $props;
+ }
- // GeoJSON
+ // GeoJSON
- if (!empty($this->geopoint)) {
+ if (!empty($this->geopoint)) {
- list($lat, $long) = explode(' ', $this->geopoint);
+ list($lat, $long) = explode(' ', $this->geopoint);
- $object['geopoint'] = array(
- 'type' => 'Point',
- 'coordinates' => array($lat, $long)
- );
- }
+ $object['geopoint'] = array(
+ 'type' => 'Point',
+ 'coordinates' => array($lat, $long)
+ );
+ }
- if (!empty($this->poco)) {
- $object['contact'] = $this->poco->asArray();
+ if (!empty($this->poco)) {
+ $object['contact'] = $this->poco->asArray();
+ }
+ Event::handle('EndActivityObjectOutputJson', array($this, &$object));
}
-
return array_filter($object);
}
}
return $isOK;
}
+
+ function showProfileBlock()
+ {
+ }
}
{
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".
- "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 "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));
}
}
$result = false;
}
- Event::handle('EndInterpretCommand', array($cmd, $arg, $user, $result));
+ Event::handle('EndInterpretCommand', array($cmd, $arg, $user, &$result));
}
return $result;
--- /dev/null
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * Default profile block to show current user's info
+ *
+ * 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);
+}
+
+/**
+ * Default profile block
+ *
+ * @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 DefaultProfileBlock extends AccountProfileBlock
+{
+ function __construct($out)
+ {
+ $user = common_current_user();
+ if (empty($user)) {
+ throw new Exception("DefaultProfileBlock with no user.");
+ }
+ parent::__construct($out, $user->getProfile());
+ }
+
+ function avatarSize()
+ {
+ return AVATAR_STREAM_SIZE;
+ }
+
+ function avatar()
+ {
+ $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
+ if (empty($avatar)) {
+ $avatar = $this->profile->getAvatar(73);
+ }
+ return (!empty($avatar)) ?
+ $avatar->displayUrl() :
+ Avatar::defaultImage(AVATAR_STREAM_SIZE);
+ }
+
+ function location()
+ {
+ return null;
+ }
+
+ function homepage()
+ {
+ return null;
+ }
+
+ function description()
+ {
+ return null;
+ }
+}
\ No newline at end of file
function showPage()
{
- if ($this->minimal) {
+ if (StatusNet::isAjax()) {
+ $this->extraHeaders();
+ $this->ajaxErrorMsg();
+ exit();
+ } if ($this->minimal) {
// Even more minimal -- we're in a machine API
// and don't want to flood the output.
$this->extraHeaders();
function showNoticeForm()
{
}
+
+ /**
+ * Show an Ajax-y error message
+ *
+ * Goes back to the browser, where it's shown in a popup.
+ *
+ * @param string $msg Message to show
+ *
+ * @return void
+ */
+
+ function ajaxErrorMsg()
+ {
+ $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');
+ $this->element('p', array('id' => 'error'), $this->message);
+ $this->elementEnd('body');
+ $this->elementEnd('html');
+ }
}
define('NOTICES_PER_PAGE', 20);
define('PROFILES_PER_PAGE', 20);
+define('MESSAGES_PER_PAGE', 20);
define('FOREIGN_NOTICE_SEND', 1);
define('FOREIGN_NOTICE_RECV', 2);
{
return array();
}
+
+ function showProfileBlock()
+ {
+ $block = new AccountProfileBlock($this, $this->profile);
+ $block->show();
+ }
}
}
return parent::getDesign();
}
+
+ function showProfileBlock()
+ {
+ $block = new GroupProfileBlock($this, $this->group);
+ $block->show();
+ }
}
--- /dev/null
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * Profile block to show for a group
+ *
+ * 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 a group
+ *
+ * @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 GroupProfileBlock extends ProfileBlock
+{
+ protected $group = null;
+
+ function __construct($out, $group)
+ {
+ parent::__construct($out);
+ $this->group = $group;
+ }
+
+ function avatar()
+ {
+ return ($this->group->homepage_logo) ?
+ $this->group->homepage_logo : User_group::defaultLogo(AVATAR_PROFILE_SIZE);
+ }
+
+ function name()
+ {
+ return $this->group->getBestName();
+ }
+
+ function url()
+ {
+ return $this->group->mainpage;
+ }
+
+ function location()
+ {
+ return $this->group->location;
+ }
+
+ function homepage()
+ {
+ return $this->group->homepage;
+ }
+
+ function description()
+ {
+ return $this->group->description;
+ }
+
+ function showActions()
+ {
+ $cur = common_current_user();
+ $this->out->elementStart('div', 'entity_actions');
+ // TRANS: Group actions header (h2). Text hidden by default.
+ $this->out->element('h2', null, _('Group actions'));
+ $this->out->elementStart('ul');
+ if (Event::handle('StartGroupActionsList', array($this, $this->group))) {
+ $this->out->elementStart('li', 'entity_subscribe');
+ if (Event::handle('StartGroupSubscribe', array($this, $this->group))) {
+ if ($cur) {
+ if ($cur->isMember($this->group)) {
+ $lf = new LeaveForm($this->out, $this->group);
+ $lf->show();
+ } else if (!Group_block::isBlocked($this->group, $cur->getProfile())) {
+ $jf = new JoinForm($this->out, $this->group);
+ $jf->show();
+ }
+ }
+ Event::handle('EndGroupSubscribe', array($this, $this->group));
+ }
+ $this->out->elementEnd('li');
+ if ($cur && $cur->hasRight(Right::DELETEGROUP)) {
+ $this->out->elementStart('li', 'entity_delete');
+ $df = new DeleteGroupForm($this->out, $this->group);
+ $df->show();
+ $this->out->elementEnd('li');
+ }
+ Event::handle('EndGroupActionsList', array($this, $this->group));
+ }
+ $this->out->elementEnd('ul');
+ $this->out->elementEnd('div');
+ }
+}
function showCore()
{
$this->elementStart('div', array('id' => 'core'));
+ $this->elementStart('div', array('id' => 'aside_primary_wrapper'));
+ $this->elementStart('div', array('id' => 'content_wrapper'));
+ $this->elementStart('div', array('id' => 'site_nav_local_views_wrapper'));
$this->showContentBlock();
$this->elementEnd('div');
+ $this->elementEnd('div');
+ $this->elementEnd('div');
+ $this->elementEnd('div');
}
function showHeader()
in_array($activity->objects[0]->type, $types));
}
+ /**
+ * Called when generating Atom XML ActivityStreams output from an
+ * ActivityObject belonging to this plugin. Gives the plugin
+ * a chance to add custom output.
+ *
+ * Note that you can only add output of additional XML elements,
+ * not change existing stuff here.
+ *
+ * If output is already handled by the base Activity classes,
+ * you can leave this base implementation as a no-op.
+ *
+ * @param ActivityObject $obj
+ * @param XMLOutputter $out to add elements at end of object
+ */
+ function activityObjectOutputAtom(ActivityObject $obj, XMLOutputter $out)
+ {
+ // default is a no-op
+ }
+
+ /**
+ * Called when generating JSON ActivityStreams output from an
+ * ActivityObject belonging to this plugin. Gives the plugin
+ * a chance to add custom output.
+ *
+ * Modify the array contents to your heart's content, and it'll
+ * all get serialized out as JSON.
+ *
+ * If output is already handled by the base Activity classes,
+ * you can leave this base implementation as a no-op.
+ *
+ * @param ActivityObject $obj
+ * @param array &$out JSON-targeted array which can be modified
+ */
+ public function activityObjectOutputJson(ActivityObject $obj, array &$out)
+ {
+ // default is a no-op
+ }
+
/**
* When a notice is deleted, delete the related objects
* by calling the overridable $this->deleteRelated().
return true;
}
+ /**
+ * Event handler gives the plugin a chance to add custom
+ * Atom XML ActivityStreams output from a previously filled-out
+ * ActivityObject.
+ *
+ * The atomOutput method is called if it's one of
+ * our matching types.
+ *
+ * @param ActivityObject $obj
+ * @param XMLOutputter $out to add elements at end of object
+ * @return boolean hook return value
+ */
+ function onEndActivityObjectOutputAtom(ActivityObject $obj, XMLOutputter $out)
+ {
+ if (in_array($obj->type, $this->types())) {
+ $this->activityObjectOutputAtom($obj, $out);
+ }
+ return true;
+ }
+
+ /**
+ * Event handler gives the plugin a chance to add custom
+ * JSON ActivityStreams output from a previously filled-out
+ * ActivityObject.
+ *
+ * The activityObjectOutputJson method is called if it's one of
+ * our matching types.
+ *
+ * @param ActivityObject $obj
+ * @param array &$out JSON-targeted array which can be modified
+ * @return boolean hook return value
+ */
+ function onEndActivityObjectOutputJson(ActivityObject $obj, array &$out)
+ {
+ if (in_array($obj->type, $this->types())) {
+ $this->activityObjectOutputJson($obj, &$out);
+ }
+ return true;
+ }
+
function onStartShowEntryForms(&$tabs)
{
$tabs[$this->tag()] = $this->appTitle();
function onStartMakeEntryForm($tag, $out, &$form)
{
- $this->log(LOG_INFO, "onStartMakeEntryForm() called for tag '$tag'");
-
if ($tag == $this->tag()) {
$form = $this->entryForm($out);
return false;
if (common_config('attachments', 'uploads')) {
$this->out->hidden('MAX_FILE_SIZE', common_config('attachments', 'file_quota'));
- // TRANS: Input label in notice form for adding an attachment.
$this->out->elementStart('label', array('class' => 'notice_data-attach'));
+ // TRANS: Input label in notice form for adding an attachment.
$this->out->text(_('Attach'));
$this->out->element('input', array('class' => 'notice_data-attach',
'type' => 'file',
$nickname = $user->nickname;
$name = $user_profile->getBestName();
+ $action = $this->actionName;
+ $mine = ($this->action->arg('nickname') == $nickname); // @fixme kinda vague
+
$this->out->elementStart('ul', array('class' => 'nav'));
if (Event::handle('StartPersonalGroupNav', array($this))) {
$nickname)),
_('Home'),
sprintf(_('%s and friends'), $name),
- $this->action == 'all', 'nav_timeline_personal');
+ $mine && $action =='all', 'nav_timeline_personal');
$this->out->menuItem(common_local_url('showstream', array('nickname' =>
$nickname)),
_('Profile'),
_('Your profile'),
- $this->action == 'showstream',
+ $mine && $action =='showstream',
'nav_profile');
$this->out->menuItem(common_local_url('replies', array('nickname' =>
$nickname)),
_('Replies'),
sprintf(_('Replies to %s'), $name),
- $this->action == 'replies', 'nav_timeline_replies');
+ $mine && $action =='replies', 'nav_timeline_replies');
$this->out->menuItem(common_local_url('showfavorites', array('nickname' =>
$nickname)),
_('Favorites'),
sprintf(_('%s\'s favorite notices'), ($user_profile) ? $name : _('User')),
- $this->action == 'showfavorites', 'nav_timeline_favorites');
+ $mine && $action =='showfavorites', 'nav_timeline_favorites');
$cur = common_current_user();
$nickname)),
_('Messages'),
_('Your incoming messages'),
- $this->action == 'inbox');
+ $mine && $action =='inbox');
}
Event::handle('EndPersonalGroupNav', array($this));
--- /dev/null
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * Superclass for profile blocks
+ *
+ * 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);
+}
+
+/**
+ * Class comment
+ *
+ * @category General
+ * @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/
+ */
+
+abstract class ProfileBlock extends Widget
+{
+ abstract function avatar();
+ abstract function name();
+ abstract function url();
+ abstract function location();
+ abstract function homepage();
+ abstract function description();
+
+ function show()
+ {
+ $this->out->elementStart('div', 'profile_block section');
+
+ $size = $this->avatarSize();
+
+ $this->out->element('img', array('src' => $this->avatar(),
+ 'class' => 'profile_block_avatar',
+ 'alt' => $this->name(),
+ 'width' => $size,
+ 'height' => $size));
+
+ $name = $this->name();
+
+ if (!empty($name)) {
+ $this->out->elementStart('p', 'profile_block_name');
+ $url = $this->url();
+ if (!empty($url)) {
+ $this->out->element('a', array('href' => $url),
+ $name);
+ } else {
+ $this->out->text($name);
+ }
+ $this->out->elementEnd('p');
+ }
+
+ $location = $this->location();
+
+ if (!empty($location)) {
+ $this->out->element('p', 'profile_block_location', $location);
+ }
+
+ $homepage = $this->homepage();
+
+ if (!empty($homepage)) {
+ $this->out->element('a', 'profile_block_homepage', $homepage);
+ }
+
+ $description = $this->description();
+
+ if (!empty($description)) {
+ $this->out->element('p',
+ 'profile_block_description',
+ $description);
+ }
+
+ $this->showActions();
+
+ $this->out->elementEnd('div');
+ }
+
+ function avatarSize()
+ {
+ return AVATAR_PROFILE_SIZE;
+ }
+
+ function showActions()
+ {
+ }
+}
$this->elementStart('div', 'help instructions');
$this->raw(common_markup_to_html($message));
$this->elementEnd('div');
-
- $this->elementEnd('div');
}
}
{
return;
}
+
+ function showProfileBlock()
+ {
+ }
}
{
protected static $have_config;
protected static $is_api;
+ protected static $is_ajax;
protected static $plugins = array();
/**
self::$is_api = $mode;
}
+ public function isAjax()
+ {
+ return self::$is_ajax;
+ }
+
+ public function setAjax($mode)
+ {
+ self::$is_ajax = $mode;
+ }
+
/**
* Build default configuration array
* @return array
$item = new ThreadedNoticeListSubItem($notice, $this->out);
$item->show();
}
+ // @fixme do a proper can-post check that's consistent
+ // with the JS side
+ if (common_current_user()) {
+ $item = new ThreadedNoticeListReplyItem($notice, $this->out);
+ $item->show();
+ }
$this->out->elementEnd('ul');
}
}
function showStart()
{
- if (Event::handle('StartOpenNoticeListItemElement', array($this))) {
- $id = (empty($this->repeat)) ? $this->notice->id : $this->repeat->id;
- $this->out->elementStart('li', array('class' => 'notice-reply-comments'));
- }
+ $this->out->elementStart('li', array('class' => 'notice-reply-comments'));
}
function showMiniForm()
$msg = sprintf(_m('Show %d reply', 'Show all %d replies', $n), $n);
$this->out->element('a', array('href' => $url), $msg);
+ }
+}
- // @fixme replace this with an ajax-friendly form pair?
- /*
- $this->out->elementStart('form',
- array('id' => $id,
- 'class' => 'replyform',
- 'method' => 'post',
- 'action' => $url));
- $this->out->hidden('token', common_session_token());
- $this->out->hidden("$id-inreplyto", $replyToId, "inreplyto");
- $this->out->element('textarea', array('name' => 'status_textarea'));
- $this->out->elementStart('div', array('class' => 'controls'));
- $this->out->submit("$id-submit", _m('Send reply'));
- $this->out->elementEnd('div');
- $this->out->elementEnd('form');
- */
+
+/**
+ * Placeholder for reply form...
+ * Same as get added at runtime via SN.U.NoticeInlineReplyPlaceholder
+ */
+class ThreadedNoticeListReplyItem extends NoticeListItem
+{
+
+ /**
+ * recipe function for displaying a single notice.
+ *
+ * This uses all the other methods to correctly display a notice. Override
+ * it or one of the others to fine-tune the output.
+ *
+ * @return void
+ */
+
+ function show()
+ {
+ $this->showStart();
+ $this->showMiniForm();
+ $this->showEnd();
+ }
+
+ /**
+ * start a single notice.
+ *
+ * @return void
+ */
+
+ function showStart()
+ {
+ $this->out->elementStart('li', array('class' => 'notice-reply-placeholder'));
+ }
+
+ function showMiniForm()
+ {
+ $this->out->element('input', array('class' => 'placeholder',
+ 'value' => _('Write a reply...')));
}
}
\ No newline at end of file
+++ /dev/null
-<?php
-/**
- * StatusNet, the distributed open-source microblogging tool
- *
- * Profile for a particular user
- *
- * 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 Sarven Capadisli <csarven@status.net>
- * @copyright 2008 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);
-}
-
-require_once INSTALLDIR.'/lib/widget.php';
-
-/**
- * Profile of a user
- *
- * Shows profile information about a particular user
- *
- * @category Output
- * @package StatusNet
- * @author Evan Prodromou <evan@status.net>
- * @author Sarven Capadisli <csarven@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 HTMLOutputter
- */
-class UserProfile extends Widget
-{
- var $user = null;
- var $profile = null;
-
- function __construct($action=null, $user=null, $profile=null)
- {
- parent::__construct($action);
- $this->user = $user;
- $this->profile = $profile;
- }
-
- function show()
- {
- $this->showProfileData();
- $this->showEntityActions();
- }
-
- function showProfileData()
- {
- if (Event::handle('StartProfilePageProfileSection', array(&$this->out, $this->profile))) {
-
- $this->out->elementStart('div', array('id' => 'i',
- 'class' => 'entity_profile vcard author'));
- // TRANS: H2 for user profile information.
- $this->out->element('h2', null, _('User profile'));
-
- if (Event::handle('StartProfilePageProfileElements', array(&$this->out, $this->profile))) {
-
- $this->showAvatar();
- $this->showNickname();
- $this->showFullName();
- $this->showLocation();
- $this->showHomepage();
- $this->showBio();
- $this->showProfileTags();
-
- Event::handle('EndProfilePageProfileElements', array(&$this->out, $this->profile));
- }
-
- $this->out->elementEnd('div');
- Event::handle('EndProfilePageProfileSection', array(&$this->out, $this->profile));
- }
- }
-
- function showAvatar()
- {
- $this->out->elementStart('div', 'ur_face');
-
- if (Event::handle('StartProfilePageAvatar', array($this->out, $this->profile))) {
-
- $avatar = $this->profile->getAvatar(AVATAR_PROFILE_SIZE);
- if (!$avatar) {
- // hack for remote Twitter users: no 96px, but large Twitter size is 73px
- $avatar = $this->profile->getAvatar(73);
- }
-
- $this->out->element('img',
- array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE),
- 'class' => 'photo avatar entity_depiction',
- 'width' => AVATAR_PROFILE_SIZE,
- 'height' => AVATAR_PROFILE_SIZE,
- 'alt' => $this->profile->nickname));
-
- $cur = common_current_user();
-
- if ($cur && $cur->id == $this->profile->id) {
- $this->out->element('a', array('href' => common_local_url('avatarsettings')), _('Edit Avatar'));
- }
-
- Event::handle('EndProfilePageAvatar',
- array($this->out, $this->profile));
- }
-
- $this->out->elementEnd('div');
- }
-
- function showNickname()
- {
- if (Event::handle('StartProfilePageNickname', array($this->out, $this->profile))) {
-
- $hasFN = ($this->profile->fullname) ? 'entity_nickname nickname url uid' : 'entity_nickname fn nickname url uid';
- $this->out->element('a',
- array('href' => $this->profile->profileurl,
- 'rel' => 'me',
- 'class' => $hasFN),
- $this->profile->nickname);
-
- Event::handle('EndProfilePageNickname', array($this->out, $this->profile));
- }
- }
-
- function showFullName()
- {
- if (Event::handle('StartProfilePageFullName', array($this->out, $this->profile))) {
- if ($this->profile->fullname) {
- $this->out->element('span',
- 'entity_fn fn',
- $this->profile->fullname);
- }
- Event::handle('EndProfilePageFullName', array($this->out, $this->profile));
- }
- }
-
- function showLocation()
- {
- if (Event::handle('StartProfilePageLocation', array($this->out, $this->profile))) {
- if ($this->profile->location) {
- $this->out->element('span',
- 'entity_location label',
- $this->profile->location);
- }
- Event::handle('EndProfilePageLocation', array($this->out, $this->profile));
- }
- }
-
- function showHomepage()
- {
- if (Event::handle('StartProfilePageHomepage', array($this->out, $this->profile))) {
- if ($this->profile->homepage) {
- $this->out->element('a',
- array('href' => $this->profile->homepage,
- 'rel' => 'me',
- 'class' => 'url entity_url'),
- $this->profile->homepage);
- }
- Event::handle('EndProfilePageHomepage', array($this->out, $this->profile));
- }
- }
-
- function showBio()
- {
- if (Event::handle('StartProfilePageBio', array($this->out, $this->profile))) {
- if ($this->profile->bio) {
- $this->out->element('div',
- 'note entity_note',
- $this->profile->bio);
- }
- Event::handle('EndProfilePageBio', array($this->out, $this->profile));
- }
- }
-
- function showProfileTags()
- {
- if (Event::handle('StartProfilePageProfileTags', array($this->out, $this->profile))) {
- $tags = Profile_tag::getTags($this->profile->id, $this->profile->id);
-
- if (count($tags) > 0) {
- $this->out->elementStart('ul', 'tags xoxo entity_tags');
- foreach ($tags as $tag) {
- $this->out->elementStart('li');
- // Avoid space by using raw output.
- $pt = '<span class="mark_hash">#</span><a rel="tag" href="' .
- common_local_url('peopletag', array('tag' => $tag)) .
- '">' . $tag . '</a>';
- $this->out->raw($pt);
- $this->out->elementEnd('li');
- }
- $this->out->elementEnd('ul');
- }
- Event::handle('EndProfilePageProfileTags', array($this->out, $this->profile));
- }
- }
-
- function showEntityActions()
- {
- 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;
- }
- if (Event::handle('StartProfilePageActionsSection', array($this->out, $this->profile))) {
-
- $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'));
- }
-}
*/
function common_shorten_links($text, $always = false, User $user=null)
{
- common_debug("common_shorten_links() called");
-
$user = common_current_user();
$maxLength = User_urlshortener_prefs::maxNoticeLength($user);
- common_debug("maxLength = $maxLength");
-
if ($always || mb_strlen($text) > $maxLength) {
- common_debug("Forcing shortening");
return common_replace_urls_callback($text, array('File_redirection', 'forceShort'), $user);
} else {
- common_debug("Not forcing shortening");
return common_replace_urls_callback($text, array('File_redirection', 'makeShort'), $user);
}
}
*/
function common_shorten_url($long_url, User $user=null, $force = false)
{
- common_debug("Shortening URL '$long_url' (force = $force)");
-
$long_url = trim($long_url);
$user = common_current_user();
$maxUrlLength = User_urlshortener_prefs::maxUrlLength($user);
- common_debug("maxUrlLength = $maxUrlLength");
// $force forces shortening even if it's not strictly needed
// I doubt URL shortening is ever 'strictly' needed. - ESP
if (mb_strlen($long_url) < $maxUrlLength && !$force) {
- common_debug("Skipped shortening URL.");
return $long_url;
}
$shortenerName = User_urlshortener_prefs::urlShorteningService($user);
- common_debug("Shortener name = '$shortenerName'");
-
if (Event::handle('StartShortenUrl',
array($long_url, $shortenerName, &$shortenedUrl))) {
if ($shortenerName == 'internal') {
{
$this->xw->writeComment($txt);
}
+
+ /**
+ * Flush output buffers
+ *
+ * @return void
+ */
+
+ function flush()
+ {
+ $this->xw->flush();
+ }
}
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:04:58+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:44+0000\n"
"Language-Team: Arabic <http://translatewiki.net/wiki/Portal:ar>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ar\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=6; plural=(n == 0) ? 0 : ( (n == 1) ? 1 : ( (n == "
"2) ? 2 : ( (n%100 >= 3 && n%100 <= 10) ? 3 : ( (n%100 >= 11 && n%100 <= "
"99) ? 4 : 5 ) ) ) );\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "مجموعات %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "مجموعات %1$s التي %2$s عضو فيها."
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "غير معروفة"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "لم يمكن إنشاء التطبيق."
+#, fuzzy
+msgid "Invalid image."
+msgstr "حجم غير صالح."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "مجموعة جديدة"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "هذا صندوق بريدك الصادر، والذي يسرد الرسائل الخاصة التي أرسلتها."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "تغيير كلمة السر"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "غيّر كلمة سرك."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "تغيير كلمة السر"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "كلمة السر القديمة"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "كلمة السر الجديدة"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 أحرف أو أكثر"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "أكّد"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "نفس كلمة السر أعلاه"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "غيّر"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "يجب أن تكون كلمة السر 6 حروف أو أكثر."
msgid "Passwords don't match."
msgstr "كلمتا السر غير متطابقتين."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "كلمة السر القديمة غير صحيحة"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "خطأ أثناء حفظ المستخدم؛ غير صالح."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "تعذّر حفظ كلمة السر الجديدة."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "حُفظت كلمة السر."
msgid "Server"
msgstr "خادوم"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "اسم مضيف خادوم الموقع."
msgid "Path"
msgstr "المسار"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "مسار الموقع"
msgid "Locale directory"
msgstr "دليل السمات"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Directory path to locales."
msgstr "مسار دليل المحليات"
msgid "Fancy URLs"
msgstr "مسارات فاخرة"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "أأستخدم مسارات فاخرة (يمكن قراءتها وتذكرها بسهولة أكبر)؟"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "السمة"
msgstr "مسار دليل المحليات"
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "بحث في الأشخاص"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "ليس وسم أشخاص صالح: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "المستخدمون الذين وسموا أنفسهم ب%1$s - الصفحة %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "هذا الإجراء يقبل طلبات POST فقط."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "لا يمكنك حذف المستخدمين."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "لا صفحة كهذه."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "الملحقات"
msgid "Default plugins"
msgstr "اللغة المبدئية"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "محتوى إشعار غير صالح."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "وسم غير صالح: \"%s\""
msgid "Restore account"
msgstr "أنشئ حسابًا"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "بعد حد الصفحة (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
#, fuzzy
msgid "Could not retrieve public stream."
msgstr "تعذّر إنشاء الكنى."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "المسار الزمني العام، صفحة %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "المسار الزمني العام"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr ""
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr ""
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr ""
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "كن أول من يُرسل!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"الآن](%%action.register%%) لتشارك اشعاراتك مع أصدقائك وعائلتك وزملائك! "
"([اقرأ المزيد](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "مجموعة %1$s، الصفحة %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "ملاحظة"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "الكنى"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-#, fuzzy
-msgid "Group actions"
-msgstr "تصرفات المستخدم"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "حُذف الإشعار."
+msgid "Notice"
+msgstr "إشعارات"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "الوسوم"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "ملف المستخدم الشخصي"
#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"سِم نفسك (حروف وأرقام و \"-\" و \".\" و \"_\")، افصلها بفاصلة (',') أو مسافة."
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "وسم غير صالح: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "الملحقات"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "الاسم"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "تصرفات المستخدم"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "حذف المستخدم قيد التنفيذ..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "عدّل إعدادات الملف الشخصي"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "عدّل"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "أرسل رسالة مباشرة إلى هذا المستخدم"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "رسالة"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "راقب"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "دور المستخدم"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "إداري"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "مراقب"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "تعذّر حذف إعدادات التصميم."
+msgid "Home"
+msgstr "الرئيسية"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "ضبط الموقع الأساسي"
msgstr[4] ""
msgstr[5] ""
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"الأوامر:\n"
-"on - شغّل الإشعار\n"
-"off - أطفئ الإشعار\n"
-"help - أظهر هذه المساعدة\n"
-"follow <nickname> - اشترك بالمستخدم\n"
-"groups - اسرد المجموعات التي أنا عضو فيها\n"
-"subscriptions - اسرد الذين أتابعهم\n"
-"subscribers - اسرد الذين يتابعونني\n"
-"leave <nickname> - ألغِ الاشتراك بمستخدم\n"
-"d <nickname> <text> - وجّه رسالة مباشرة إلى مستخدم\n"
-"get <nickname> - اجلب آخر رسالة من مستخدم\n"
-"whois <nickname> - اجلب معلومات ملف المستخدم\n"
-"lose <nickname> - أجبر المستخدم على عدم تتبعك\n"
-"fav <nickname> - اجعل آخر إشعار من المستخدم مفضلًا\n"
-"fav #<notice_id> - اجعل الإشعار ذا رقم الهوية المعطى مفضلا\n"
-"repeat #<notice_id> - كرّر الإشعار ذا رقم الهوية المعطى\n"
-"repeat <nickname> - كرّر آخر إشعار من المستخدم\n"
-"reply #<notice_id> - رُد على الإشعار ذي رقم الهوية المعطى\n"
-"reply <nickname> - رُد على آخر إشعار من المستخدم\n"
-"join <group> - انضم إلى مجموعة\n"
-"login - اجلب وصلة الولوج إلى واجهة الوب\n"
-"drop <group> - اترك المجموعة\n"
-"stats - اجلب إحصاءاتك\n"
-"stop - مثل 'off'\n"
-"quit - مثل 'off'\n"
-"sub <nickname> - مثل 'follow'\n"
-"unsub <nickname> - مثل 'leave'\n"
-"last <nickname> - مثل 'get'\n"
-"on <nickname> - لم يطبق بعد.\n"
-"off <nickname> - لم يطبق بعد.\n"
-"nudge <nickname> - ذكّر مستخدمًا بإشعار أرسلته.\n"
-"invite <phone number> - لم يطبق بعد.\n"
-"track <word> - لم يطبق بعد.\n"
-"untrack <word> - لم يطبق بعد.\n"
-"track off - لم يطبق بعد.\n"
-"untrack all - لم يطبق بعد.\n"
-"tracks - لم يطبق بعد.\n"
-"tracking - لم يطبق بعد.\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "نتائج الأمر"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "تعذّر تشغيل الإشعار."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "تعذّر إطفاء الإشعارات."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "اشترك بهذا المستخدم"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "ألغِ الاشتراك مع هذا المستخدم"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "رسالة مباشرة %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "معلومات الملف الشخصي"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "كرّر هذا الإشعار"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "رُد على هذا الإشعار"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "غير معروفة"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "احذف المستخدم"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "الأمر لم يُجهزّ بعد."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
#, fuzzy
msgid "Database error"
msgstr "خطأ قاعدة بيانات"
-msgid "Home"
-msgstr "الرئيسية"
-
msgid "Public"
msgstr "عام"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "مكان تواجدك، على سبيل المثال \"المدينة، الولاية (أو المنطقة)، الدولة\""
+msgid "Aliases"
+msgstr "الكنى"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+#, fuzzy
+msgid "Group actions"
+msgstr "تصرفات المستخدم"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "المجموعات الأكثر أعضاءً"
msgid "Notice repeated"
msgstr "الإشعار مكرر"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "نبّه هذا المستخدم"
msgid "User %1$s (%2$d) has no profile record."
msgstr "ليس للمستخدم ملف شخصي."
-msgid "Edit Avatar"
-msgstr "عدّل الأفتار"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "تصرفات المستخدم"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "حذف المستخدم قيد التنفيذ..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "عدّل إعدادات الملف الشخصي"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "عدّل"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "أرسل رسالة مباشرة إلى هذا المستخدم"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "رسالة"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "راقب"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "دور المستخدم"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "إداري"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "مراقب"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "لست والجًا."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "مسار %s الزمني"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "ابحث عن أشخاص على هذا الموقع"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "وسم غير صالح: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:04:59+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:45+0000\n"
"Language-Team: Egyptian Spoken Arabic <http://translatewiki.net/wiki/Portal:"
"arz>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: arz\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=6; plural= n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "مجموعات %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, fuzzy, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "المجموعات التى %s عضو فيها"
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "مش معروف"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "مش ممكن إنشاء الapplication."
+#, fuzzy
+msgid "Invalid image."
+msgstr "حجم غير صالح."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "مجموعه جديدة"
msgid "This is your outbox, which lists private messages you have sent."
msgstr ""
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "غيّر كلمه السر"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "غيّر كلمه سرك."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "تغيير كلمه السر"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "كلمه السر القديمة"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "كلمه سر جديدة"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 حروف أو أكثر. مطلوب."
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "أكّد"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "نفس كلمه السر أعلاه"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "غيّر"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "يجب أن تكون كلمه السر 6 حروف أو أكثر."
msgid "Passwords don't match."
msgstr "كلمتا السر غير متطابقتين."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "كلمه السر القديمه غير صحيحة"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "خطأ أثناء حفظ المستخدم؛ غير صالح."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "تعذّر حفظ كلمه السر الجديده."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "حُفظت كلمه السر."
msgid "Server"
msgstr "خادوم"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "اسم مضيف خادوم الموقع."
msgid "Path"
msgstr "المسار"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "مسار الموقع"
msgid "Locale directory"
msgstr "دليل السمات"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Directory path to locales."
msgstr "مسار دليل المحليات"
msgid "Fancy URLs"
msgstr "مسارات فاخرة"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "أأستخدم مسارات فاخره (يمكن قراءتها وتذكرها بسهوله أكبر)؟"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "السمة"
msgstr "مسار دليل المحليات"
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "بحث فى الأشخاص"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "ليس عنوان بريد صالح."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr ""
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "لا يمكنك حذف المستخدمين."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "لا وسم كهذا."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+msgctxt "TITLE"
msgid "Plugins"
msgstr ""
msgid "Default plugins"
msgstr "اللغه المفضلة"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "حجم غير صالح."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "وسم غير صالح: \"%s\""
msgid "Restore account"
msgstr "أنشئ مجموعه جديدة"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, fuzzy, php-format
msgid "Beyond the page limit (%s)."
msgstr "وراء حد الصفحه (%s)"
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
#, fuzzy
msgid "Could not retrieve public stream."
msgstr "تعذّر إنشاء الكنى."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "المسار الزمنى العام، صفحه %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "المسار الزمنى العام"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr ""
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr ""
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr ""
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "كن أول من يُرسل!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"الآن](%%action.register%%) لتشارك اشعاراتك مع أصدقائك وعائلتك وزملائك! "
"([اقرأ المزيد](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "%1$s اعضاء الجروپ, صفحه %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "ملاحظة"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "الكنى"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-#, fuzzy
-msgid "Group actions"
-msgstr "تصرفات المستخدم"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "حُذف الإشعار."
+#, fuzzy
+msgid "Notice"
+msgstr "الإشعارات"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "الوسوم"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "ملف المستخدم الشخصي"
msgstr "اعمل tag لليوزر"
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "وسم غير صالح: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr ""
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "الاسم"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "تصرفات المستخدم"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "عدّل إعدادات الملف الشخصي"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "عدّل"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "أرسل رساله مباشره إلى هذا المستخدم"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "رسالة"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr ""
+
+#. TRANS: Label text on user profile to select a user role.
+#, fuzzy
+msgid "User role"
+msgstr "ملف المستخدم الشخصي"
+
+#. TRANS: Role that can be set for a user profile.
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "الإداريون"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "تعذّر حذف إعدادات التصميم."
+msgid "Home"
+msgstr "الرئيسية"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "ضبط الموقع الأساسي"
msgstr[4] ""
msgstr[5] ""
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "نتائج الأمر"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "مش نافعه تتكرر الملاحظتك بتاعتك."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "مش نافعه تتكرر الملاحظتك بتاعتك."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "اشترك بهذا المستخدم"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "ألغِ الاشتراك مع هذا المستخدم"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "رساله مباشره %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "معلومات الملف الشخصي"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "كرر هذا الإشعار"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "رُد على هذا الإشعار"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "مش معروف"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "احذف المستخدم"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "اكتمل الأمر"
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "خطأ قاعده بيانات"
-msgid "Home"
-msgstr "الرئيسية"
-
msgid "Public"
msgstr "عام"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr ""
+msgid "Aliases"
+msgstr "الكنى"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+#, fuzzy
+msgid "Group actions"
+msgstr "تصرفات المستخدم"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "المجموعات الأكثر أعضاءً"
msgid "Notice repeated"
msgstr "الإشعار مكرر"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "نبّه هذا المستخدم"
msgid "User %1$s (%2$d) has no profile record."
msgstr "ليس للمستخدم ملف شخصى."
-msgid "Edit Avatar"
-msgstr "عدّل الأفتار"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "تصرفات المستخدم"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "عدّل إعدادات الملف الشخصي"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "عدّل"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "أرسل رساله مباشره إلى هذا المستخدم"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "رسالة"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr ""
-
-#. TRANS: Label text on user profile to select a user role.
-#, fuzzy
-msgid "User role"
-msgstr "ملف المستخدم الشخصي"
-
-#. TRANS: Role that can be set for a user profile.
-#, fuzzy
-msgctxt "role"
-msgid "Administrator"
-msgstr "الإداريون"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr ""
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "لست والجًا."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "مسار %s الزمني"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "ابحث عن أشخاص على هذا الموقع"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "وسم غير صالح: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:00+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:46+0000\n"
"Language-Team: Bulgarian <http://translatewiki.net/wiki/Portal:bg>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: bg\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Групи на %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, fuzzy, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Групи, в които участва %s"
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Непознато"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Грешка при отбелязване като любима."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Неправилен размер."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Нова група"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "Това е изходящата ви кутия с лични съобщения до други потребители."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Смяна на паролата"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Смяна на паролата."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
#, fuzzy
msgid "Password change"
msgstr "Паролата е записана."
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Стара парола"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Нова парола"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 или повече знака"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Потвърждаване"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Също като паролата по-горе"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Промяна"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Паролата трябва да е 6 или повече знака."
msgid "Passwords don't match."
msgstr "Паролите не съвпадат."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Грешна стара парола"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Грешка при запазване на потребител — невалидност."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Грешка при запазване на новата парола."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Паролата е записана."
msgid "Server"
msgstr "Сървър"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr ""
msgid "Path"
msgstr "Път"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "Път до сайта"
msgid "Locale directory"
msgstr "Директория на аватара"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr ""
msgid "Fancy URLs"
msgstr "Кратки URL-адреси"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
+#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "Theme"
msgstr ""
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Търсене на хора"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Неправилен адрес на е-поща."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, fuzzy, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Бележки с етикет %s, страница %d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Не можете да изтривате потребители."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Няма такака страница."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Приставки"
msgid "Default plugins"
msgstr "Език по подразбиране"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Неправилен размер."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Неправилен етикет: \"%s\""
msgid "Restore account"
msgstr "Създаване на нова сметка"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr ""
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Грешка при изтегляне на общия поток"
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Общ поток, страница %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Общ поток"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Емисия на общия поток (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Емисия на общия поток (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Емисия на общия поток (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"friends, family, and colleagues! ([Read more](%%doc.help%%))"
msgstr ""
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "%1$s, страница %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Бележка"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Псевдоними"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-#, fuzzy
-msgid "Group actions"
-msgstr "Потребителски действия"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Бележката е изтрита."
+msgid "Notice"
+msgstr "Бележки"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Етикети"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Потребителски профил"
msgstr "Етикети"
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Неправилен етикет: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Приставки"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Име"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Потребителски действия"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Редактиране на профила"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Редактиране"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Изпращате на пряко съобщение до този потребител."
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Съобщение"
+
+#. TRANS: Label text on user profile to select a user role.
+#, fuzzy
+msgid "Moderate"
+msgstr "Модератор"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Потребителска роля"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Администратор"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Модератор"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Грешка при записване настройките за Twitter"
+msgid "Home"
+msgstr "Лична страница"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Основна настройка на сайта"
msgstr[0] "Не членувате в тази група."
msgstr[1] "Не членувате в тази група."
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Резултат от командата"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Грешка при включване на уведомлението."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Грешка при изключване на уведомлението."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Абониране за този потребител"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Отписване от този потребител"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Преки съобщения до %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Данни на профила"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Повтаряне на тази бележка"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Отговаряне на тази бележка"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Непозната група."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Изтриване на потребител"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Командата все още не се поддържа."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "Грешка в базата от данни"
-msgid "Home"
-msgstr "Лична страница"
-
msgid "Public"
msgstr "Общ поток"
msgstr ""
"Къде се намира групата — град, община, държава и т.н. (ако е приложимо)"
+msgid "Aliases"
+msgstr "Псевдоними"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+#, fuzzy
+msgid "Group actions"
+msgstr "Потребителски действия"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Групи с най-много членове"
msgid "Notice repeated"
msgstr "Бележката е повторена."
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Побутване на този потребител"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Потребителят няма профил."
-msgid "Edit Avatar"
-msgstr "Редактиране на аватара"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Потребителски действия"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Редактиране на профила"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Редактиране"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Изпращате на пряко съобщение до този потребител."
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Съобщение"
-
-#. TRANS: Label text on user profile to select a user role.
-#, fuzzy
-msgid "Moderate"
-msgstr "Модератор"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Потребителска роля"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Администратор"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Модератор"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Не сте влезли в системата."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "Поток на %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Търсене на хора в сайта"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Неправилен етикет: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:02+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:47+0000\n"
"Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: br\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Strollad %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Strolladoù %1s m'eo ezel %2s."
msgstr "Klask alioù en danvez"
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+#, fuzzy
+msgid "Unknown notice."
msgstr "Notenn dianav."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "N'eo ket posubl krouiñ ar poellad."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Ment direizh."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Strollad nevez"
msgid "This is your outbox, which lists private messages you have sent."
msgstr ""
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Cheñch ger-tremen"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Cheñch ger-tremen."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Kemmañ ger-tremen"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Ger-tremen kozh"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Ger-tremen nevez"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 arouezenn pe muioc'h"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Kadarnaat"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Memestra eget ar ger tremen a-us"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Kemmañ"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Rankout a ra ar ger-tremen bezañ gant 6 arouezenn d'an nebeutañ."
msgid "Passwords don't match."
msgstr "Ne glot ket ar gerioù-tremen."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Ger-termen kozh direizh"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Ur fazi 'zo bet e-pad enolladenn an implijer ; diwiriek."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Dibosupl eo enrollañ ar ger-tremen nevez."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Ger-tremen enrollet."
msgid "Server"
msgstr "Servijer"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Anv ostiz servijer al lec'hienn."
msgid "Path"
msgstr "Hent"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "Hent al lec'hienn"
msgid "Locale directory"
msgstr "Doser an temoù"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr ""
msgid "Fancy URLs"
msgstr "URLioù brav"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Danvez"
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Klask tud"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "N'eo ket reizh ar merk-se : %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Implijerien bet merket drezo o unan gant %1$s - pajenn %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "N'hallit ket diverkañ implijerien."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "N'eus ket eus ar bajenn-se."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Pluginoù"
msgid "Default plugins"
msgstr "Yezh dre ziouer"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Danvez direizh an ali."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"Aotre-implijout ar menegoù \"%1$s\" ne ya ket gant aotre-implijout al "
"lec'hienn \"%2$s\"."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Balizenn direizh : \"%s\""
msgid "Restore account"
msgstr "Krouiñ ur gont"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Dreist da bevennoù ar bajenn (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Dibosupl eo adtapout al lanv foran."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Lanv foran - pajenn %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Lanv foran"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Neudenn gwazh foran (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Neudenn gwazh foran (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Neudenn gwazh foran (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
msgstr ""
"Kronologiezh foran %%site.name%% eo, met den n'en deus skrivet tra ebet."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Bezit an hini gentañ da bostañ !"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Perak ne [groufec'h ket ur gont](%%action.register%%) ha bezañ an hini "
"gentañ da embann un dra !"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, fuzzy, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"%%site.name%% a zo ur servij [micro-blogging](http://br.wikipedia.org/wiki/"
"Microblog) diazezet war ar meziant frank [StatusNet](http://status.net/)."
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Strollad %1$s, pajenn %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Notenn"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Aliasoù"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Obererezh ar strollad"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Ali dilammet."
+#, fuzzy
+msgid "Notice"
+msgstr "Ali"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Merk %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Profil an implijer"
msgid "Tag user"
msgstr "Merkañ an implijer"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Merkoù evit an implijer-mañ (lizherennoù, sifroù, -, ., ha _), dispartiet "
"gant virgulennoù pe gant esaouennoù"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Balizenn direizh : \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Pluginoù"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Anv"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Obererezh an implijer"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Diverkadenn an implijer o vont war-raok..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Kemmañ arventennoù ar profil"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Aozañ"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Kas ur gemennadenn war-eeun d'an implijer-mañ"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Kemennadenn"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Habaskaat"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Rol an implijer"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Merour"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Habasker"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Dibosupl eo dilemel an arventennoù krouiñ."
+msgid "Home"
+msgstr "Degemer"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Arventennoù diazez al lec'hienn"
msgstr[0] "You are a member of this group:"
msgstr[1] "You are a member of these groups:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Disoc'hoù an urzhiad"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Dibosupl eo gweredekaat ar c'hemennoù."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Dibosupl eo diweredekaat ar c'hemennoù."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "En em goumanantiñ d'an implijer-mañ"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "En em zigoumanantiñ eus an implijer-mañ"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Kemennadennoù war-eeun kaset da %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Titouroù ar profil"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Adkregiñ gant ar c'hemenn-mañ"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Respont d'ar c'hemenn-mañ"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Strollad dianav."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Dilemel ar strollad"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Digarezit, n'eo ket bet emplementet an urzhiad-mañ c'hoazh."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "Fazi bank roadennoù"
-msgid "Home"
-msgstr "Degemer"
-
msgid "Public"
msgstr "Foran"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "El lec'h m'emaoc'h, da skouer \"Kêr, Stad (pe Rannvro), Bro\""
+msgid "Aliases"
+msgstr "Aliasoù"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Ouzhpennañ pe kemmañ tres ar strollad %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Obererezh ar strollad"
+
#. TRANS: Title for groups with the most members section.
#, fuzzy
msgid "Groups with most members"
msgid "Notice repeated"
msgstr "Ali adkemeret"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Kas ur blinkadenn d'an implijer-mañ"
msgid "User %1$s (%2$d) has no profile record."
msgstr "An implijer-mañ n'eus profil ebet dezhañ."
-msgid "Edit Avatar"
-msgstr "Kemmañ an Avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Obererezh an implijer"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Diverkadenn an implijer o vont war-raok..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Kemmañ arventennoù ar profil"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Aozañ"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Kas ur gemennadenn war-eeun d'an implijer-mañ"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Kemennadenn"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Habaskaat"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Rol an implijer"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Merour"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Habasker"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Nann-kevreet."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "Oberezhioù %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Klask tud el lec'hienn-mañ"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Balizenn direizh : \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:03+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:49+0000\n"
"Language-Team: Catalan <http://translatewiki.net/wiki/Portal:ca>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ca\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Grups de %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%1$s grups dels que %2$s és membre."
msgstr "Només es poden preferir els avisos."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+#, fuzzy
+msgid "Unknown notice."
msgstr "Nota desconeguda."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "No s'ha pogut crear l'aplicació."
+#, fuzzy
+msgid "Invalid image."
+msgstr "La mida no és vàlida."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Nou grup"
"Aquesta és la teva safata de sortida, que et mostrarà els missatges privats "
"que has enviat."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Canvia la contrasenya"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Canvieu la vostra contrasenya"
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Contrasenya canviada."
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Antiga contrasenya"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nova contrasenya"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "6 o més caràcters."
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Confirma"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "Igual que la contrasenya de dalt"
+#. TRANS: Button text on page where to change password.
+msgctxt "BUTTON"
msgid "Change"
msgstr "Canvia"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "La contrasenya hauria de ser d'entre 6 a més caràcters."
msgid "Passwords don't match."
msgstr "Les contrasenyes no coincideixen."
-msgid "Incorrect old password"
-msgstr "Contrasenya antiga incorrecta"
+#. TRANS: Form validation error on page where to change password.
+msgid "Incorrect old password."
+msgstr "La contrasenya antiga no és correcta"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "S'ha produït un error en desar l'usuari; no és vàlid."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
msgid "Cannot save new password."
msgstr "No es pot desar la nova contrasenya."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Contrasenya guardada."
msgid "Server"
msgstr "Servidor"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Servidor central del lloc."
msgid "Path"
msgstr "Camí"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Camí del lloc."
msgid "Locale directory"
msgstr "Directori de les traduccions"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Camí del directori a les traduccions."
msgid "Fancy URLs"
msgstr "URL atractius"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Voleu fer servir URL atractius (més fàcils de llegir i de recordar)?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Tema"
msgstr "Directori on es troben les adjuncions."
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Cerca de gent"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "No és una etiqueta de gent vàlida: %s"
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Usuaris que s'han etiquetat amb %1$s - pàgina %2$d"
msgid "Disabled"
msgstr "Inhabilitat"
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Aquesta acció només accepta sol·licituds POST."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
msgid "You cannot administer plugins."
msgstr "No es poden administrar els connectors."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "No existeix la pàgina."
msgstr "Habilitat"
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Connectors"
msgid "Default plugins"
msgstr "Connectors per defecte"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
"S'han inhabilitat tots els connectors per defecte del fitxer de configuració "
"del lloc."
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "El contingut de l'avís no és vàlid."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"La llicència ‘%1$s’ de l'avís no és compatible amb la llicència ‘%2$s’ del "
"lloc."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Etiqueta no vàlida: «%s»."
msgid "Restore account"
msgstr "Restaura el compte"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Més enllà del límit de la pàgina (%s)"
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "No s'ha pogut recuperar la conversa pública."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Línia temporal pública, pàgina %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Línia temporal pública"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Flux de canal públic (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Flux de canal públic (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Flux de canal públic (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Aquesta és la línia temporal pública de %%site.name%%, però ningú no hi ha "
"enviat res encara."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Sigueu el primer en escriure-hi!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Per què no [registreu un compte](%%action.register%%) i sou el primer en "
"escriure-hi!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"[Uniu-vos-hi ara](%%action.register%%) per compartir què feu amb els vostres "
"amics, familiars, i companys! ([Més informació](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "grup %1$s, pàgina %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Avisos"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Àlies"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Accions del grup"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "S'ha eliminat l'avís."
+msgid "Notice"
+msgstr "Avisos"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Etiqueta %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Perfil de l'usuari"
msgid "Tag user"
msgstr "Etiqueta usuari"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Etiquetes d'aquest usuari (lletres, nombres,, -, ., i _), comes o separades "
"amb espais"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "L'etiqueta no és vàlida: «%s»"
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Hauríeu d'haver rebut una còpia de la llicència GNU Affero General Public "
"License juntament amb el programa. Si no és així, consulteu %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Connectors"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Nom"
msgid "No AtomPub API service for %s."
msgstr "No hi ha cap servei API d'AtomPub de %s."
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Accions de l'usuari"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "S'està eliminant l'usuari..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Edita la configuració del perfil"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Edita"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Envia un missatge directe a aquest usuari"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Missatge"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Modera"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Rol de l'usuari"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrador"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderador"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "No s'ha pogut eliminar el paràmetre de disseny."
+msgid "Home"
+msgstr "Pàgina personal"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Configuració bàsica del lloc"
msgstr[0] "Sou un membre d'aquest grup:"
msgstr[1] "Sou un membre d'aquests grups:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Ordres:\n"
-"on - activeu els avisos\n"
-"off - desactiveu els avisos\n"
-"help - mostra aquesta ajuda\n"
-"follow <nickname> - se subscriu a l'usuari\n"
-"groups - llista els grups on us heu unit\n"
-"subscriptions - llista la gent que seguiu\n"
-"subscribers - llista la gent que us segueix\n"
-"leave <nickname> - cancel·la la subscripció de l'usuari\n"
-"d <nickname> <text> - missatge directe a l'usuari\n"
-"get <nickname> - s'obté el darrer avís de l'usuari\n"
-"whois <nickname> - s'obté la informació del perfil de l'usuari\n"
-"lose <nickname> - es força l'usuari a deixar de seguir-vos\n"
-"fav <nickname> - afegeix el darrer avís de l'usuari com a «preferit»\n"
-"fav #<notice_id> - afegeix l'avís amb l'id donat com a «preferit»\n"
-"repeat #<notice_id> - repeteix l'avís amb l'id donat\n"
-"repeat <nickname> - repeteix el darrer avís de l'usari\n"
-"reply #<notice_id> - respon l'avís amb l'id donat\n"
-"reply <nickname> - respon el darrer avís de l'usuari\n"
-"join <group> - s'uneix al grup\n"
-"login - s'obté un enllaç per iniciar una sessió des de la interfície web\n"
-"drop <group> - es deixa el grup\n"
-"stats - s'obté el vostre estat\n"
-"stop - el mateix que «off»\n"
-"quit - el mateix que «off»\n"
-"sub <nickname> - el mateix que «follow»\n"
-"unsub <nickname> - el mateix que «leave»\n"
-"last <nickname> - el mateix que «get»\n"
-"on <nickname> - no s'ha implementat encara.\n"
-"off <nickname> - no s'ha implementat encara.\n"
-"nudge <nickname> - es recorda a l'usuari que actualitzi.\n"
-"invite <phone number> - no s'ha implementat encara.\n"
-"track <word> - no s'ha implementat encara.\n"
-"untrack <word> - no s'ha implementat encara.\n"
-"track off - no s'ha implementat encara.\n"
-"untrack all - no s'ha implementat encara.\n"
-"tracks - no s'ha implementat encara.\n"
-"tracking - no s'ha implementat encara.\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Resultats de les comandes"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "No es poden activar els avisos."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "No es poden desactivar els avisos."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Subscriu-me a aquest usuari"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Cancel·la la subscripció d'aquest usuari"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Missatges directes a %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "El perfil remot no és un grup!"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Repeteix l'avís"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Respon a aquest avís"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Grup desconegut."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Elimina el grup"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Comanda encara no implementada."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "No configuration file found."
msgid "Database error"
msgstr "Error de la base de dades"
-msgid "Home"
-msgstr "Pàgina personal"
-
msgid "Public"
msgstr "Públic"
msgstr ""
"Ubicació del grup, si s'hi adiu cap, com ara «ciutat, comarca (o illa), país»."
+msgid "Aliases"
+msgstr "Àlies"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Afegeix o edita el disseny de %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Accions del grup"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Grups amb més membres"
msgid "Notice repeated"
msgstr "Avís repetit"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Crida l'atenció a l'usuari"
msgid "User %1$s (%2$d) has no profile record."
msgstr "L'usuari %1$s (%2$d) no té un registre de perfil."
-msgid "Edit Avatar"
-msgstr "Edita l'avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Accions de l'usuari"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "S'està eliminant l'usuari..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Edita la configuració del perfil"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Edita"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Envia un missatge directe a aquest usuari"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Missatge"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Modera"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Rol de l'usuari"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrador"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderador"
-
msgid "Not allowed to log in."
msgstr "No es permet iniciar una sessió."
msgid "Getting backup from file '%s'."
msgstr "Es recupera la còpia de seguretat del fitxer '%s'."
-#~ msgid "Friends timeline"
-#~ msgstr "Línia temporal dels amics"
-
-#~ msgid "Everyone on this site"
-#~ msgstr "Tothom en aquest lloc"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "L'etiqueta no és vàlida: «%s»"
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:04+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:50+0000\n"
"Language-Team: Czech <http://translatewiki.net/wiki/Portal:cs>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: cs\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ( (n >= 2 && n <= 4) ? 1 : "
"2 );\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "skupiny uživatele %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "skupiny na %1$s, kterych je %2$s členem."
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Neznámé"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Nelze vytvořit aplikaci."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Neplatná velikost"
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Nová skupina"
"Toto je váš outbox, který obsahuje seznam soukromých zpráv které jste "
"odeslali."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Změnit heslo"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Změňte své heslo."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Změna hesla"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Staré heslo"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nové heslo"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 a více znaků"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Potvrdit"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Stejné jako heslo výše"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Změnit"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Heslo musí být alespoň 6 znaků dlouhé"
msgid "Passwords don't match."
msgstr "Hesla nesouhlasí"
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Nesprávné staré heslo"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Chyba při ukládaní uživatele; neplatný."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Nelze uložit nové heslo"
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Heslo uloženo"
msgid "Server"
msgstr "Server"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Hostname (jméno) serveru stránek."
msgid "Path"
msgstr "Cesta"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "Cesta ke stránkám (za jménem serveru)"
msgid "Locale directory"
msgstr "adresář tématu"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Directory path to locales."
msgstr "Cesta k adresáři locales"
msgid "Fancy URLs"
msgstr "Hezké URL"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Použijte Fancy (více čitelné a zapamatovatelné) URL?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Téma"
msgstr "Cesta k adresáři locales"
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Hledání lidí"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Není platný člověkotag: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Uživatelé kteří se sami otagovali %1$s - strana %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Tato akce přijímá pouze POST požadavky."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Nemůžete odstranit uživatele."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Tady žádná taková stránka není."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Pluginy"
msgid "Default plugins"
msgstr "Výchozí jazyk"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Neplatná velikost"
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "Licence hlášky ‘%1$s’ není kompatibilní s licencí webu ‘%2$s’."
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Neplatná velikost"
msgid "Restore account"
msgstr "Zaregistrujte se"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Přes limit stránky (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Nepodařilo se získat veřejný proud."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Veřejná časová osa, strana %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Veřejné zprávy"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Veřejný Stream Feed (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Veřejný Stream Feed (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Veřejný Stream Feed (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
msgstr ""
"Tohle je veřejná časová osa %%site.name%%, ale nikdo zatím nic nenapsal."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Pošlete něco jako první!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
"Proč ne [zaregistrovat účet](%%action.register%%) a poslat něco jako první!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"status.net/). [Zaregistrujte se](%%action.register%%) a sdílejte hlášky o "
"sobě s přáteli, rodinou a kolegy! ([Čtěte více](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "skupina %1$s, str. %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Poznámka"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Aliasy"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Akce skupiny"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Oznámení smazáno."
+#, fuzzy
+msgid "Notice"
+msgstr "Sdělení"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Otagujte %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Uživatelský profil"
msgid "Tag user"
msgstr "Otagujte uživatele"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Tagy pro tohoto uživatele (písmena, číslice, -,., a _), oddělené čárkou nebo "
"mezerou"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Neplatná velikost"
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Měli byste obdržet kopii GNU Affero General Public License spolu s tímto "
"programem. Pokud ne, jděte na %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Pluginy"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Název"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Akce uživatele"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Probíhá mazání uživatele..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Upravit nastavení profilu"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Editovat"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Odeslat přímou zprávu tomuto uživateli"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Zpráva"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderovat"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Role uživatele"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrátor"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderátor"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Nelze smazat nastavení vzhledu."
+msgid "Home"
+msgstr "Moje stránky"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Základní konfigurace webu"
msgstr[1] "Jste členem těchto skupin:"
msgstr[2] ""
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Příkazy:\n"
-"on - zapnout oznámení\n"
-"off - vypnout oznámení\n"
-"help - zobrazí tuto nápovědu\n"
-"follow <nickname> - Přihlásit se k uživatel\n"
-"groups - seznam skupin, ke kterým jste připojen\n"
-"subscriptions - seznam lidí, které sledujete\n"
-"subscribers - seznam osob, které vás sledují\n"
-"leave <přezdívka> - Odhlásit se od uživatele\n"
-"d <přezdívka> <text> - Přímá zpráva uživateli\n"
-"get <přezdívka> - Dostanete poslední upozornění od uživatele\n"
-"whois <přezdívka> - Získat informace o profilu uživatele\n"
-"lose <přezdívka> - Donutit uživatele přestat vás sledovat\n"
-"fav <přezdívka> - Přidejte uživatelovo poslední oznámení jako 'Oblíbené'\n"
-"fav #<notice_id> - Přidat upozornění s daným id jako 'Oblíbené'\n"
-"repeat #<notice_id> - Opakovat oznámení s daným id\n"
-"repeat <přezdívka> - Opakovat poslední oznámení od uživatele\n"
-"reply #<notice_id> - Odpověď na oznámení s daným id\n"
-"reply <přezdívka> - Odpověď na poslední oznámení od uživatele\n"
-"join <skupina> - Připojit se ke skupině\n"
-"login - Získat odkaz pro přihlášení k webovému rozhraní\n"
-"drop <skupina> - Opustit skupinu\n"
-"stats - získejte Vaše statistiky\n"
-"stop - stejné jako 'off'\n"
-"quit - stejné jako 'off'\n"
-"sub <přezdívka> - Stejné jako 'follow'\n"
-"unsub <přezdívka> - Stejné jako 'leave'\n"
-"last <přezdívka> - Stejné jako 'get'\n"
-"on <přezdívka> - Dosud neimplementován.\n"
-"off <přezdívka> - Dosud neimplementován.\n"
-"nudge <přezdívka> - Připomenout uživateli aby něco poslal.\n"
-"invite <telefonní číslo> - Dosud neimplementován.\n"
-"track <word> - Dosud neimplementován.\n"
-"untrack <word> -Dosud neimplementován.\n"
-"track off - Dosud neimplementován.\n"
-"untrack all - Dosud neimplementován.\n"
-"tracks - Dosud neimplementován.\n"
-"tracking - Dosud neimplementován.\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Výsledky příkazu"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Nelze zapnout oznámení."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Nelze vypnout oznámení."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Přihlásit se k tomuto uživateli"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Odhlásit se od tohoto uživatele"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Přímé zprávy uživateli %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Nastavené Profilu"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Opakovat toto oznámení"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Odpovědět na toto oznámení"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Neznámé"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Smazat uživatele"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Příkaz ještě nebyl implementován."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
#, fuzzy
msgid "Database error"
msgstr "Chyba databáze"
-msgid "Home"
-msgstr "Moje stránky"
-
msgid "Public"
msgstr "Veřejné"
"Umístění skupiny, pokud je nějaké, ve stylu \"město, stát (nebo region), země"
"\""
+msgid "Aliases"
+msgstr "Aliasy"
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Akce skupiny"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Skupiny s nejvíce členy"
msgid "Notice repeated"
msgstr "Sdělení opakováno"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Pošťuchovat tohoto uživatele"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Uživatel nemá profil."
-msgid "Edit Avatar"
-msgstr "Upravit avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Akce uživatele"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Probíhá mazání uživatele..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Upravit nastavení profilu"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Editovat"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Odeslat přímou zprávu tomuto uživateli"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Zpráva"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderovat"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Role uživatele"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrátor"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderátor"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Nejste přihlášen(a)."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "časová osa %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Najít lidi na této stránce"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Neplatná velikost"
# Author: Bavatar
# Author: Brion
# Author: George Animal
+# Author: Habi
# Author: Kghbln
# Author: Lutzgh
# Author: March
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:05+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:51+0000\n"
"Language-Team: German <http://translatewiki.net/wiki/Portal:de>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: de\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
#. TRANS: Title for Atom feed.
msgctxt "ATOM"
msgid "Main"
-msgstr ""
+msgstr "Main"
#. TRANS: Title for Atom feed. %s is a user nickname.
#. TRANS: Message is used as link title. %s is a user nickname.
msgstr "Empfänger nicht gefunden."
#. TRANS: Client error displayed trying to direct message another user who's not a friend (403).
-#, fuzzy
msgid "Cannot send direct messages to users who aren't your friend."
msgstr ""
"Es können keine direkten Nachrichten an Benutzer geschickt werden mit denen "
msgid "%s's groups"
msgstr "Gruppen von %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%1$s Gruppen in denen %2$s Mitglied ist"
#. TRANS: API validation exception thrown when alias is the same as nickname.
#. TRANS: Group create form validation error.
-#, fuzzy
msgid "Alias cannot be the same as nickname."
-msgstr "Alias kann nicht das gleiche wie der Spitzname sein."
+msgstr "Alias kann nicht gleich wie der Spitzname sein."
#. TRANS: Client error displayed when uploading a media file has failed.
msgid "Upload failed."
#. TRANS: Client error displayed when trying to delete a notice not using the Atom format.
msgid "Can only delete using the Atom format."
-msgstr ""
+msgstr "Kann nur im Atom-Format gelöscht werden"
#. TRANS: Client error displayed when a user has no rights to delete notices of other users.
#. TRANS: Error message displayed trying to delete a notice that was not made by the current user.
msgid "Repeated to %s"
msgstr "Antworten an %s"
-#, fuzzy, php-format
+#, php-format
msgid "%1$s notices that were to repeated to %2$s / %3$s."
-msgstr "Nachrichten von %1$s, die auf Nachrichten von %2$s / %3$s antworten."
+msgstr "%1$s Nachrichten, die auf %2$s / %3$s wiederholt wurden."
#. TRANS: Title of list of repeated notices of the logged in user.
#. TRANS: %s is the nickname of the logged in user.
msgid "Repeats of %s"
msgstr "Antworten von %s"
-#, fuzzy, php-format
+#, php-format
msgid "%1$s notices that %2$s / %3$s has repeated."
-msgstr "%1$s markierte Nachricht %2$s als Favorit."
+msgstr "%1$s Notizen wurden von %2$s / %3$s wiederholt."
#. TRANS: Title for timeline with lastest notices with a given tag.
#. TRANS: %s is the tag.
#. TRANS: %s is the unsupported activity object type.
#, php-format
msgid "Cannot handle activity object type \"%s\"."
-msgstr ""
+msgstr "Aktivität mit Objekttyp \"%s\" kann nicht bearbeitet werden."
#. TRANS: Client error displayed when posting a notice without content through the API.
#. TRANS: %d is the notice ID (number).
#. TRANS: Subtitle for Atom favorites feed.
#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename.
-#, fuzzy, php-format
+#, php-format
msgid "Notices %1$s has favorited on %2$s"
-msgstr "Aktualisierungen von %1$s und Freunden auf %2$s!"
+msgstr "Notizen, die von %1$s auf %2$s favorisiert wurden."
#. TRANS: Client exception thrown when trying to set a favorite for another user.
#. TRANS: Client exception thrown when trying to subscribe another user.
-#, fuzzy
msgid "Cannot add someone else's subscription."
msgstr "Konnte neues Abonnement nicht eintragen."
#. TRANS: Client exception thrown when trying use an incorrect activity verb for the Atom pub method.
#, fuzzy
msgid "Can only handle favorite activities."
-msgstr "Durchsuche den Inhalt der Nachrichten"
+msgstr "Kann nur Favoriten-Aktionen bearbeiten."
#. TRANS: Client exception thrown when trying favorite an object that is not a notice.
#, fuzzy
msgid "Can only fave notices."
-msgstr "Durchsuche den Inhalt der Nachrichten"
+msgstr "Kann nur Notizen favorisieren."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+#, fuzzy
+msgid "Unknown notice."
msgstr "Unbekannter Hinweis."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: %1$s is a username, %2$s is the StatusNet sitename.
#, fuzzy, php-format
msgid "Groups %1$s is a member of on %2$s"
-msgstr "Gruppen, in denen „%s“ Mitglied ist"
+msgstr "Gruppen %1$s ist ein Mitglied von %2$s"
#. TRANS: Client exception thrown when trying subscribe someone else to a group.
#, fuzzy
msgid "Cannot add someone else's membership."
-msgstr "Konnte neues Abonnement nicht eintragen."
+msgstr "Kann Abonnement von jemand anderem nicht eintragen."
#. TRANS: Client error displayed when not using the POST verb.
#. TRANS: Do not translate POST.
#, fuzzy
msgid "Can only handle join activities."
-msgstr "Durchsuche den Inhalt der Nachrichten"
+msgstr "Kann nur Beitritts-Aktivitäten durchführen."
#. TRANS: Client exception thrown when trying to subscribe to a non-existing group.
msgid "Unknown group."
#. TRANS: Client exception thrown when trying to remove a favorite notice of another user.
#, fuzzy
msgid "Cannot delete someone else's favorite."
-msgstr "Konnte Favoriten nicht löschen."
+msgstr "Kann Favoriten von jemand anderem nicht löschen."
#. TRANS: Client exception thrown when referencing a non-existing group.
#. TRANS: Client error displayed when requesting a list of blocked users for a non-local group.
#. TRANS: Client exception thrown when deleting someone else's membership.
#, fuzzy
msgid "Cannot delete someone else's membership."
-msgstr "Konnte Selbst-Abonnement nicht löschen."
+msgstr "Konnte Abonnement von jemand anderem nicht löschen."
#. TRANS: Client exception thrown when trying to display a subscription for a non-existing profile ID.
#. TRANS: %d is the non-existing profile ID number.
#. TRANS: Client error displayed when not using the follow verb.
msgid "Can only handle Follow activities."
-msgstr ""
+msgstr "Kann nur Abonnements-Funktionen bearbeiten."
#. TRANS: Client exception thrown when subscribing to an object that is not a person.
msgid "Can only follow people."
#. TRANS: Client error displayed trying to subscribe to an already subscribed profile.
#. TRANS: %s is the profile the user already has a subscription on.
-#, fuzzy, php-format
+#, php-format
msgid "Already subscribed to %s."
-msgstr "Bereits abonniert!"
+msgstr "%s ist bereits abonniert."
#. TRANS: Client error displayed trying to get a non-existing attachment.
msgid "No such attachment."
#. TRANS: Avatar upload form instruction after uploading a file.
#, fuzzy
msgid "Pick a square area of the image to be your avatar."
-msgstr ""
-"Wähle eine quadratische Fläche aus dem Bild, um dein Avatar zu speichern"
+msgstr "Wähle einen quadratischen Bereich aus dem Bild als dein Avatar."
#. TRANS: Server error displayed if an avatar upload went wrong somehow server side.
#. TRANS: Server error displayed trying to crop an uploaded group logo that is no longer present.
#. TRANS: Client exception thrown when trying to backup an account without having backup rights.
msgid "You may not backup your account."
-msgstr ""
+msgstr "Dein Konto kann nicht gesichert werden."
#. TRANS: Information displayed on the backup account page.
msgid ""
"addresses is not backed up. Additionally, uploaded files and direct messages "
"are not backed up."
msgstr ""
+"Dein Konto kann im <a href=\"http://activitystrea.ms/\">Activity Streams</a>-"
+"Format gesichert werden. Dies ist eine experimentelle Funktion und stellt "
+"nur ein unvollständige Sicherung dar: private Kontoinformationen wie Email "
+"und IM-Adressen werden nicht gesichert. Zusätzlich werden hochgeladene "
+"Dateien und direkte Nachrichten nicht gesichert."
#. TRANS: Submit button to backup an account on the backup account page.
msgctxt "BUTTON"
#. TRANS: Title for submit button to backup an account on the backup account page.
#, fuzzy
msgid "Backup your account."
-msgstr "Backup-Konto"
+msgstr "Sicherheitskopie des Konto erstellen."
#. TRANS: Client error displayed when blocking a user that has already been blocked.
msgid "You already blocked that user."
#. TRANS: Submit button title for 'No' when blocking a user.
#, fuzzy
msgid "Do not block this user."
-msgstr "Diesen Benutzer freigeben"
+msgstr "Diesen Benutzer nicht blokieren."
#. TRANS: Button label on the user block form.
#. TRANS: Button label on the delete application form.
#. TRANS: %s is the text that needs to be input.
#, php-format
msgid "You must write \"%s\" exactly in the box."
-msgstr ""
+msgstr "In der Box muss genau \"%s\" eingetragen werden."
#. TRANS: Confirmation that a user account has been deleted.
msgid "Account deleted."
"This will <strong>permanently delete</strong> your account data from this "
"server."
msgstr ""
+"Dein Konto und alle Daten auf diesem Server werden <strong>unwiderruflich "
+"gelöscht</strong>."
#. TRANS: Additional form text for user deletion form shown if a user has account backup rights.
#. TRANS: %s is a URL to the backup page.
"You are strongly advised to <a href=\"%s\">back up your data</a> before "
"deletion."
msgstr ""
+"Vor der Löschung raten wir dir dringend, <a href=\"%s\">eine Sicherungskopie "
+"deiner Daten zu erstellen</a>."
#. TRANS: Field label for delete account confirmation entry.
#. TRANS: Field label for password reset form where the password has to be typed again.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgstr "Diesen Benutzer nicht löschen"
#. TRANS: Submit button title for 'Yes' when deleting a user.
-#, fuzzy
msgid "Delete this user."
-msgstr "Diesen Benutzer löschen"
+msgstr "Diesen Benutzer löschen."
#. TRANS: Message used as title for design settings for the site.
msgid "Design"
"To send notices via email, we need to create a unique email address for you "
"on this server:"
msgstr ""
+"Um Notizen per Email zu senden, müssen wir für dich eine eindeutige "
+"Emailadresse generieren."
#. TRANS: Button label for adding an e-mail address to send notices from.
#. TRANS: Button label for adding an SMS e-mail address to send notices from.
#. TRANS: Message given saving e-mail address that cannot be normalised.
#, fuzzy
msgid "Cannot normalize that email address."
-msgstr "Konnte diese E-Mail-Adresse nicht normalisieren"
+msgstr "Diese e-Mail-Adresse kann nicht normalisiert werden."
#. TRANS: Message given saving e-mail address that not valid.
msgid "Not a valid email address."
#, php-format
msgid "%s screenname."
-msgstr ""
+msgstr "%s Benutzername."
#. TRANS: Header for IM preferences form.
#, fuzzy
msgid "Could not create application."
msgstr "Konnte das Programm nicht erstellen."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Ungültige Größe."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Neue Gruppe"
#. TRANS: Server error displayed in oEmbed request when a path is not supported.
#. TRANS: %s is a path.
-#, php-format
+#, fuzzy, php-format
msgid "\"%s\" not supported for oembed requests."
-msgstr ""
+msgstr "\"%s\" ist für Oembed-Anfragen nicht unterstützt."
#. TRANS: Error message displaying attachments. %s is a raw MIME type (eg 'image/png')
#, php-format
msgstr ""
"Das hier ist dein Postausgang, er beinhaltet deine gesendeten Nachrichten."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Passwort ändern"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Ändere dein Passwort."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Passwort geändert"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Altes Passwort"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Neues Passwort"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "6 oder mehr Zeichen"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Bestätigen"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "Gleiches Passwort wie zuvor"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Ändern"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Das Passwort muss aus 6 oder mehr Zeichen bestehen."
msgid "Passwords don't match."
msgstr "Passwörter stimmen nicht überein."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Altes Passwort falsch"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Fehler beim Speichern des Benutzers, ungültig."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Konnte neues Passwort nicht speichern"
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Passwort gespeichert."
msgid "Server"
msgstr "Server"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Server-Name der Seite"
msgid "Path"
msgstr "Pfad"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Seitenpfad."
msgid "Locale directory"
msgstr "Sprachpfad"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Pfad zu den Sprachen."
msgid "Fancy URLs"
msgstr "Schicke URLs."
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Schicke URLs (lesbarer und besser zu merken) verwenden?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Motiv"
msgstr "Pfad, in dem sich die Themes befinden."
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Suche nach anderen Benutzern"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Ungültiger Personen-Tag: „%s“."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Benutzer, die sich selbst mit „%1$s“ getaggt haben - Seite %2$d"
#. TRANS: Page title for AJAX form return when a disabling a plugin.
msgctxt "plugin"
msgid "Disabled"
-msgstr ""
+msgstr "Deaktiviert"
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Diese Aktion nimmt nur POST-Requests"
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Du kannst keine Benutzer löschen."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Seite nicht vorhanden"
#. TRANS: Page title for AJAX form return when enabling a plugin.
msgctxt "plugin"
msgid "Enabled"
-msgstr ""
+msgstr "Aktiviert"
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Erweiterungen"
"\"http://status.net/wiki/Plugins\">online plugin documentation</a> for more "
"details."
msgstr ""
+"Zusätzliche Plugins können eingeschaltet und manuell konfiguriert werden. In "
+"der <a href=\"http://status.net/wiki/Plugins\">Plugin Dokumentation</a> "
+"findest du mehr Details."
#. TRANS: Admin form section header
#, fuzzy
msgid "Default plugins"
msgstr "Bevorzugte Sprache"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
-msgstr ""
+msgstr "Alle Standard-Plugins der Konfigurationsdatei wurden deaktiviert."
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Ungültiger Nachrichteninhalt."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"Die Nachrichtenlizenz „%1$s“ ist nicht kompatibel mit der Lizenz der Seite „%"
"2$s“."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Ungültiges Stichwort: „%s“"
msgid "Restore account"
msgstr "Neues Benutzerkonto erstellen"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Jenseits des Seitenlimits (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Konnte öffentlichen Stream nicht abrufen."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Öffentliche Zeitleiste, Seite %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Öffentliche Zeitleiste"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Feed des öffentlichen Streams (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Feed des öffentlichen Streams (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Feed des öffentlichen Streams (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Dies ist die öffentliche Zeitleiste von %%site.name%%, es wurde allerdings "
"noch nichts gepostet."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Sei der erste, der etwas schreibt!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Warum nicht ein [Benutzerkonto anlegen](%%action.register%%) und den ersten "
"Beitrag abschicken!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"Nachrichten mit deinen Freunden, Familie oder Kollegen aus! ([Mehr "
"Informationen](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
#. TRANS: Client exception displayed trying to restore an account while something went wrong uploading a file.
#. TRANS: Client exception. No file; probably just a non-AJAX submission.
-#, fuzzy
msgid "No uploaded file."
-msgstr "Datei hochladen"
+msgstr "Datei hochladen."
#. TRANS: Client exception thrown when an uploaded file is larger than set in php.ini.
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
"Feed has been restored. Your old posts should now appear in search and your "
"profile page."
msgstr ""
+"Dein Feed wurde reaktiviert. Deine alten Einträge sollten nun in der Suche "
+"und auf deiner Profilseite erscheinen."
#. TRANS: Message when a feed restore is in progress.
msgid "Feed will be restored. Please wait a few minutes for results."
-msgstr ""
+msgstr "Feed wird wiederhergestellt. Dies kann einige Minuten dauern."
#. TRANS: Form instructions for feed restore.
msgid ""
"You can upload a backed-up stream in <a href=\"http://activitystrea.ms/"
"\">Activity Streams</a> format."
msgstr ""
+"Eine Sicherungskopie kann im <a href=\"http://activitystrea.ms/\">Activity "
+"Streams</a>-Format hochgeladen werden."
#. TRANS: Title for submit button to confirm upload of a user backup file for account restore.
msgid "Upload the file"
msgid "%1$s group, page %2$d"
msgstr "%1$s Gruppe, Seite %d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Nachricht"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Pseudonyme"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Gruppenaktionen"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Nachricht gelöscht."
+msgid "Notice"
+msgstr "Nachrichten"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Tag „%s“"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Benutzerprofil"
msgid "Tag user"
msgstr "Benutzer taggen"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Tags dieses Benutzers (Buchstaben, Nummer, -, ., und _), durch Komma oder "
"Leerzeichen getrennt"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Ungültiges Stichwort: „%s“"
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
msgstr "Nichts"
msgid "[internal]"
-msgstr ""
+msgstr "[internal]"
#. TRANS: Label for dropdown with URL shortener services.
msgid "Shorten URLs with"
msgstr "URL-Auto-Kürzungs-Dienst."
msgid "URL longer than"
-msgstr ""
+msgstr "URL länger als"
msgid "URLs longer than this will be shortened, 0 means always shorten."
-msgstr ""
+msgstr "längere URLs werden gekürzt. 0 bedeutet immer verkürzen."
msgid "Text longer than"
-msgstr ""
+msgstr "Text länger als"
msgid ""
"URLs in notices longer than this will be shortened, 0 means always shorten."
-msgstr ""
+msgstr "längere URLs werden gekürzt. 0 bedeutet immer verkürzen."
#. TRANS: Form validation error for form "Other settings" in user profile.
msgid "URL shortening service is too long (maximum 50 characters)."
msgstr "URL-Auto-Kürzungs-Dienst ist zu lang (maximal 50 Zeichen)."
msgid "Invalid number for max url length."
-msgstr ""
+msgstr "Ungültige Zahl für maximale URL-Länge."
-#, fuzzy
msgid "Invalid number for max notice length."
-msgstr "Ungültiger Nachrichteninhalt."
+msgstr "Ungültige Zahl für maximale Nachrichten-Länge."
msgid "Error saving user URL shortening preferences."
-msgstr ""
+msgstr "Fehler beim speichern der URL-Verkürzungs-Einstellungen."
#. TRANS: User admin panel title
msgctxt "TITLE"
"Du hast eine Kopie der GNU Affero General Public License zusammen mit diesem "
"Programm erhalten. Wenn nicht, siehe %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Erweiterungen"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Name"
#. TRANS: Server exception.
msgid "Single-user mode code called when not enabled."
-msgstr ""
+msgstr "Einzeluser-Modus aufgerufen, aber nicht aktiviert."
#. TRANS: Server exception thrown when creating a group failed.
msgid "Could not create group."
#. TRANS: %s is the remote site.
#, fuzzy, php-format
msgid "Cannot locate account %s."
-msgstr "Du kannst keine Benutzer löschen."
+msgstr "Kann Konto %s nicht finden."
#. TRANS: Exception thrown when a service document could not be located account move.
#. TRANS: %s is the remote site.
#, php-format
msgid "Cannot find XRD for %s."
-msgstr ""
+msgstr "XRD für %s kann nicht gefunden werden."
#. TRANS: Exception thrown when an account could not be located when it should be moved.
#. TRANS: %s is the remote site.
#, php-format
msgid "No AtomPub API service for %s."
-msgstr ""
+msgstr "AtomPub API für %s kann nicht gefunden werden."
+
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Benutzeraktionen"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Löschung des Benutzers in Arbeit …"
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Profil-Einstellungen ändern"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Direkte Nachricht an Benutzer versenden"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Nachricht"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderieren"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Benutzerrolle"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrator"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
#. TRANS: Placeholder text for inline reply form. Clicking in this box will turn it into a mini notice form.
msgid "Write a reply..."
-msgstr ""
+msgstr "Antwort verfassen..."
#, fuzzy
msgid "Status"
-msgstr "StatusNet"
+msgstr "Status"
#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set.
#. TRANS: Text between [] is a link description, text between () is the link itself.
#. TRANS: Client exception thrown when using an unknown verb for the activity importer.
#, fuzzy, php-format
msgid "Unknown verb: \"%s\"."
-msgstr "Unbekannte Sprache „%s“"
+msgstr "Unbekanntes Verb: „%s“"
#. TRANS: Client exception thrown when trying to force a subscription for an untrusted user.
msgid "Cannot force subscription for untrusted user."
-msgstr ""
+msgstr "Abonnement für nicht vertrauten Benutzer kann nicht forciert werden."
#. TRANS: Client exception thrown when trying to for a remote user to subscribe.
#, fuzzy
msgid "Cannot force remote user to subscribe."
-msgstr "Gib den Namen des Benutzers an, den du abonnieren möchtest."
+msgstr "Kann entfernten Benutzer nicht forciert abonnieren."
#. TRANS: Client exception thrown when trying to subscribe to an unknown profile.
#, fuzzy
#. TRANS: Client exception thrown when trying to import an event not related to the importing user.
msgid "This activity seems unrelated to our user."
-msgstr ""
+msgstr "Diese Aktivität scheint nicht mit dem Benutzer zusammenzuhängen."
#. TRANS: Client exception thrown when trying to join a remote group that is not a group.
msgid "Remote profile is not a group!"
-msgstr ""
+msgstr "Entferntes Profil ist keine Gruppe!"
#. TRANS: Client exception thrown when trying to join a group the importing user is already a member of.
#, fuzzy
#. TRANS: %1$s is the source URI of the notice, %2$s is the URI of the author.
#, php-format
msgid "Already know about notice %1$s and it has a different author %2$s."
-msgstr ""
+msgstr "Ich kennne Notz %1$s bereits. Diese hat einen anderen Autor: %2$s"
#. TRANS: Client exception thrown when trying to overwrite the author information for a non-trusted user during import.
msgid "Not overwriting author info for non-trusted user."
-msgstr ""
+msgstr "Autor für nicht-vertrauten Benutzer wird nicht überschrieben."
#. TRANS: Client exception thrown when trying to import a notice without content.
#. TRANS: %s is the notice URI.
msgid "Unable to delete design setting."
msgstr "Konnte die Design-Einstellungen nicht löschen."
+msgid "Home"
+msgstr "Homepage"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Basis-Seiteneinstellungen"
msgstr "Kein Programm mit diesem Anwender-Schlüssel."
msgid "Not allowed to use API."
-msgstr ""
+msgstr "Darf API nicht verwenden."
#. TRANS: OAuth exception given when an incorrect access token was given for a user.
msgid "Bad access token."
#. TRANS: Exception thrown when no token association could be found.
msgid ""
"Could not find a profile and application associated with the request token."
-msgstr ""
+msgstr "Konnte kein Profil und Anwendung für das Anfrage-Token finden."
#. TRANS: Exception thrown when no access token can be issued.
#, fuzzy
msgstr[0] "Du bist Mitglied dieser Gruppe:"
msgstr[1] "Du bist Mitglied dieser Gruppen:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Befehle:\n"
-"on - Benachrichtigung einschalten\n"
-"off - Benachrichtigung ausschalten\n"
-"help - diese Hilfe anzeigen\n"
-"follow <nickname> - einem Benutzer folgen\n"
-"groups - Gruppen auflisten in denen du Mitglied bist\n"
-"subscriptions - Leute auflisten denen du folgst\n"
-"subscribers - Leute auflisten die dir folgen\n"
-"leave <nickname> - einem Benutzer nicht mehr folgen\n"
-"d <nickname> <text> - Direkte Nachricht an einen Benutzer schicken\n"
-"get <nickname> - letzte Nachricht eines Benutzers abrufen\n"
-"whois <nickname> - Profil eines Benutzers abrufen\n"
-"lose <nickname> - Benutzer zwingen dir nicht mehr zu folgen\n"
-"fav <nickname> - letzte Nachricht eines Benutzers als Favorit markieren\n"
-"fav #<notice_id> - Nachricht mit bestimmter ID als Favorit markieren\n"
-"repeat #<notice_id> - Nachricht mit bestimmter ID wiederholen\n"
-"repeat <nickname> - letzte Nachricht eines Benutzers wiederholen\n"
-"reply #<notice_id> - Nachricht mit bestimmter ID beantworten\n"
-"reply <nickname> - letzte Nachricht eines Benutzers beantworten\n"
-"join <group> - Gruppe beitreten\n"
-"login - Link zum Anmelden auf der Webseite anfordern\n"
-"drop <group> - Gruppe verlassen\n"
-"stats - deine Statistik abrufen\n"
-"stop - Äquivalent zu „off“\n"
-"quit - Äquivalent zu „off“\n"
-"sub <nickname> - Äquivalent zu „follow“\n"
-"unsub <nickname> - Äquivalent zu „leave“\n"
-"last <nickname> - Äquivalent zu „get“\n"
-"on <nickname> - noch nicht implementiert\n"
-"off <nickname> - noch nicht implementiert\n"
-"nudge <nickname> - einen Benutzer ans Aktualisieren erinnern\n"
-"invite <phone number> - noch nicht implementiert\n"
-"track <word> - noch nicht implementiert\n"
-"untrack <word> - noch nicht implementiert\n"
-"track off - noch nicht implementiert\n"
-"untrack all - noch nicht implementiert\n"
-"tracks - noch nicht implementiert\n"
-"tracking - noch nicht implementiert\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Befehl-Ergebnisse"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Konnte Benachrichtigung nicht aktivieren."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Konnte Benachrichtigung nicht deaktivieren."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Abonniere diesen Benutzer"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Abonnement von diesem Benutzer abbestellen"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Direkte Nachrichten an %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Entferntes Profil ist keine Gruppe!"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Diese Nachricht wiederholen"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Auf diese Nachricht antworten"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Unbekannte Gruppe."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Gruppe löschen"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Befehl noch nicht implementiert."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "No configuration file found."
msgid "Database error"
msgstr "Datenbankfehler."
-msgid "Home"
-msgstr "Homepage"
-
msgid "Public"
msgstr "Zeitleiste"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "Ort der Gruppe, optional, beispielsweise „Stadt, Region, Land“."
+msgid "Aliases"
+msgstr "Pseudonyme"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "%s-Design hinzufügen oder bearbeiten"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Gruppenaktionen"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Gruppen mit den meisten Mitgliedern"
msgid "Notice repeated"
msgstr "Nachricht wiederholt"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Gib diesem Benutzer einen Stups"
#. TRANS: Plugin admin panel controls
msgctxt "plugin"
msgid "Disable"
-msgstr ""
+msgstr "Deaktivieren"
#. TRANS: Plugin admin panel controls
msgctxt "plugin"
msgid "Enable"
-msgstr ""
+msgstr "Aktivieren"
msgctxt "plugin-description"
msgid "(Plugin descriptions unavailable when disabled.)"
-msgstr ""
+msgstr "(Plugin Beschreibung nicht verfügbar wenn deaktiviert.)"
msgid "Settings"
msgstr "SMS-Einstellungen"
msgstr "URL"
msgid "URL shorteners"
-msgstr ""
+msgstr "URL-Verkürzer"
msgid "Updates by instant messenger (IM)"
msgstr "Aktualisierungen via Instant Messenger (IM)"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Benutzer „%1$s“ (%2$d) hat kein Profil."
-msgid "Edit Avatar"
-msgstr "Avatar bearbeiten"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Benutzeraktionen"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Löschung des Benutzers in Arbeit …"
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Profil-Einstellungen ändern"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Bearbeiten"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Direkte Nachricht an Benutzer versenden"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Nachricht"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderieren"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Benutzerrolle"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrator"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderator"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Nicht angemeldet."
#. TRANS: Exception.
msgid "Invalid XML, missing XRD root."
-msgstr ""
+msgstr "Ungültiges XML, XRD-Root fehlt."
#. TRANS: Commandline script output. %s is the filename that contains a backup for a user.
#, php-format
msgid "Getting backup from file '%s'."
msgstr "Hole Backup von der Datei „%s“."
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s-Zeitleiste"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Finde Leute auf dieser Seite"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Ungültiges Stichwort: „%s“"
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:06+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:53+0000\n"
"Language-Team: British English <http://translatewiki.net/wiki/Portal:en-gb>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: en-gb\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "%s's groups"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%1$s groups %2$s is a member of."
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Unknown"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Could not create application."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Invalid size."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "New group"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "This is your outbox, which lists private messages you have sent."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Change password"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Change your password."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Password change"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Old password"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "New password"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 or more characters"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Confirm"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Same as password above"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Change"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Password must be 6 or more characters."
msgid "Passwords don't match."
msgstr "Passwords don't match."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Error saving user; invalid."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Can't save new password."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Password saved."
msgid "Server"
msgstr "Server"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr ""
msgid "Path"
msgstr ""
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "Site path"
msgid "Locale directory"
msgstr "Locale Directory"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr ""
msgid "Fancy URLs"
msgstr ""
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
+#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "Theme"
msgstr ""
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "People search"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Not a valid people tag: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Users self-tagged with %1$s - page %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "You cannot delete users."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "No such page."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+msgctxt "TITLE"
msgid "Plugins"
msgstr ""
msgid "Default plugins"
msgstr "Default language"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Invalid notice content."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Invalid tag: \"%s\""
msgid "Restore account"
msgstr "Create an account"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr ""
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Could not retrieve public stream."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Public timeline, page %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Public timeline"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Public Stream Feed (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Public Stream Feed (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Public Stream Feed (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
"Why not [register an account](%%action.register%%) and be the first to post!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"tool. [Join now](%%action.register%%) to share notices about yourself with "
"friends, family, and colleagues! ([Read more](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "%1$s group, page %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Note"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr ""
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Group actions"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Notice deleted."
+msgid "Notice"
+msgstr "Notices"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Tag %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "User profile"
msgid "Tag user"
msgstr "Tag user"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
"separated"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Invalid tag: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"You should have received a copy of the GNU Affero General Public License "
"along with this program. If not, see %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr ""
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Name"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "User actions"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Edit profile settings"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Edit"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Send a direct message to this user"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Message"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderate"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "User role"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrator"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Unable to delete design setting."
+msgid "Home"
+msgstr "Homepage"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Basic site configuration"
msgstr[0] "You are a member of this group:"
msgstr[1] "You are a member of these groups:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Command results"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Can't turn on notification."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Can't turn off notification."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Subscribe to this user"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Unsubscribe from this user"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Direct messages to %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Profile information"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Repeat this notice"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Reply to this notice"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Unknown"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Delete group"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Command not yet implemented."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
#, fuzzy
msgid "Database error"
msgstr ""
-msgid "Home"
-msgstr "Homepage"
-
msgid "Public"
msgstr "Public"
msgstr ""
"Location for the group, if any, like \"City, State (or Region), Country\""
+msgid "Aliases"
+msgstr ""
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Group actions"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Groups with most members"
msgid "Notice repeated"
msgstr "Notice repeated"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Nudge this user"
msgid "User %1$s (%2$d) has no profile record."
msgstr "User %1$s (%2$d) has no profile record."
-msgid "Edit Avatar"
-msgstr "Edit Avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "User actions"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Edit profile settings"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Edit"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Send a direct message to this user"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Message"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderate"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "User role"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrator"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderator"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Not logged in."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s timeline"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Find people on this site"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Invalid tag: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:07+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:54+0000\n"
"Language-Team: Esperanto <http://translatewiki.net/wiki/Portal:eo>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: eo\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Grupoj de %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Grupoj de %2$s ĉe %1$s."
"Please return to the application and enter the following security code to "
"complete the process."
msgstr ""
-"Bonvolu reiri al %s kaj enigu la jenan sekureco-kodo por plenumi la procezon."
+"Bonvolu reiri al la aplikaĵo kaj enigi la jenan sekurecan kodon por "
+"kompletigi la procezon."
#. TRANS: Title of the page notifying the user that the client application was successfully authorized to access the user's account with OAuth.
#. TRANS: %s is the authorised application name.
#. TRANS: Client error displayed when the parameter "status" is missing.
#. TRANS: %d is the maximum number of character for a notice.
-#, fuzzy, php-format
+#, php-format
msgid "That's too long. Maximum notice size is %d character."
msgid_plural "That's too long. Maximum notice size is %d characters."
-msgstr[0] "Tro longas. Longlimo por avizo estas %d signoj."
+msgstr[0] "Tro longa. Longlimo por avizo estas %d signo."
msgstr[1] "Tro longas. Longlimo por avizo estas %d signoj."
#. TRANS: Client error displayed when replying to a non-existing notice.
msgid "Maximum notice size is %d character, including attachment URL."
msgid_plural "Maximum notice size is %d characters, including attachment URL."
msgstr[0] ""
-"Longlimo por avizo estas %d signoj, enkalkulante ankaŭ la retadresojn."
+"Longlimo por avizo estas %d signo, enkalkulante ankaŭ la retadresojn."
msgstr[1] ""
"Longlimo por avizo estas %d signoj, enkalkulante ankaŭ la retadresojn."
#, fuzzy, php-format
msgid "%1$s notices that %2$s / %3$s has repeated."
-msgstr "%s (@%s) ŝatis vian avizon"
+msgstr "Avizoj ĉe %1$s, ripetitaj de %2$s / %3$s."
#. TRANS: Title for timeline with lastest notices with a given tag.
#. TRANS: %s is the tag.
#. TRANS: Client error displayed trying to add a notice to another user's timeline.
#, fuzzy
msgid "Only the user can add to their own timeline."
-msgstr "Nur uzanto povas legi sian propran paŝton."
+msgstr "Oni ne povas aldoni al tempstrio de aliulo."
#. TRANS: Client error displayed when using another format than AtomPub.
msgid "Only accept AtomPub for Atom feeds."
#. TRANS: Subtitle for Atom favorites feed.
#. TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename.
-#, fuzzy, php-format
+#, php-format
msgid "Notices %1$s has favorited on %2$s"
msgstr "Avizoj, ŝatmarkitaj de %1$s ĉe %2$s"
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Nekonata"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: %s is a username.
#, fuzzy, php-format
msgid "%s group memberships"
-msgstr "%s grupanoj"
+msgstr "Grupanecoj de %s"
#. TRANS: Subtitle for group membership feed.
#. TRANS: %1$s is a username, %2$s is the StatusNet sitename.
-#, fuzzy, php-format
+#, php-format
msgid "Groups %1$s is a member of on %2$s"
-msgstr "Grupoj de %s"
+msgstr "Grupoj, kies ano %1$s estas ĉe %2$s"
#. TRANS: Client exception thrown when trying subscribe someone else to a group.
-#, fuzzy
msgid "Cannot add someone else's membership."
msgstr "Estas neeble aldoni anecon de aliulo."
#. TRANS: Client error displayed when not using the POST verb.
#. TRANS: Do not translate POST.
-#, fuzzy
msgid "Can only handle join activities."
-msgstr "Serĉi enhavon ĉe la retejo"
+msgstr ""
#. TRANS: Client exception thrown when trying to subscribe to a non-existing group.
msgid "Unknown group."
msgstr "Ne estas ano."
#. TRANS: Client exception thrown when deleting someone else's membership.
-#, fuzzy
msgid "Cannot delete someone else's membership."
-msgstr "Ne eblas forigi abonon al vi mem."
+msgstr "Estas neeble forigi anecon de aliulo."
#. TRANS: Client exception thrown when trying to display a subscription for a non-existing profile ID.
#. TRANS: %d is the non-existing profile ID number.
#. TRANS: Client error displayed trying to subscribe to an already subscribed profile.
#. TRANS: %s is the profile the user already has a subscription on.
-#, fuzzy, php-format
+#, php-format
msgid "Already subscribed to %s."
-msgstr "Jam abonato!"
+msgstr "%s jam abonitas de vi."
#. TRANS: Client error displayed trying to get a non-existing attachment.
msgid "No such attachment."
#. TRANS: Button on avatar upload page to delete current avatar.
#. TRANS: Button text for user account deletion.
-#, fuzzy
msgctxt "BUTTON"
msgid "Delete"
msgstr "Forigi"
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
#. TRANS: Additional text on page where groups can be searched if no results were found for a query for a logged in user.
#. TRANS: This message contains Markdown links in the form [link text](link).
-#, fuzzy, php-format
+#, php-format
msgid ""
"If you cannot find the group you're looking for, you can [create it](%%"
"action.newgroup%%) yourself."
msgstr ""
-"Se vi ne trovas grupon, kiun vi serĉas, vi povas mem [krei ĝin](%%action."
-"newgroup%%)."
+"Se vi ne povas trovi grupon, kiun vi serĉas, vi povas mem [krei ĝin](%%"
+"action.newgroup%%)."
#. TRANS: Additional text on page where groups can be searched if no results were found for a query for a not logged in user.
#. TRANS: This message contains Markdown links in the form [link text](link).
msgstr "Tujmesaĝilaj preferoj"
#. TRANS: Checkbox label in IM preferences form.
-#, fuzzy
msgid "Send me notices"
-msgstr "Sendi avizon"
+msgstr "Sendi al mi avizojn"
#. TRANS: Checkbox label in IM preferences form.
-#, fuzzy
msgid "Post a notice when my status changes."
-msgstr "Afiŝu avizon tiam, kiam mia Jabber/GTalk-stato ŝanĝiĝas."
+msgstr "Afiŝi avizon, kiam ŝanĝiĝas mia tujmesaĝila stato."
#. TRANS: Checkbox label in IM preferences form.
-#, fuzzy
msgid "Send me replies from people I'm not subscribed to."
-msgstr ""
-"Sendu al mi per Jabber/GTalk respondojn de personoj, kiujn mi ne abonas."
+msgstr "Sendi al mi respondojn de personoj, kiujn mi ne abonas."
#. TRANS: Checkbox label in IM preferences form.
#, fuzzy
#. TRANS: Server error thrown on database error updating IM preferences.
#, fuzzy
msgid "Couldn't update IM preferences."
-msgstr "Malsukcesis ĝisdatigi uzanton"
+msgstr "Malsukcesis ĝisdatigi tujmesaĝajn agordojn."
#. TRANS: Confirmation message for successful IM preferences save.
#. TRANS: Confirmation message after saving preferences.
msgstr "Jabber-ID jam apartenas al alia uzanto."
#. TRANS: Message given saving valid IM address that is to be confirmed.
-#, fuzzy
msgid "A confirmation code was sent to the IM address you added."
-msgstr ""
-"Konfirmo-kodo senditas al la tujmesaĝila adreso aldonita. Vi devas permesi "
-"al %s sendi mesaĝojn al vi."
+msgstr "Konfirmo-kodo senditas al la tujmesaĝila adreso, kiun vi aldonis."
#. TRANS: Message given canceling IM address confirmation for the wrong IM address.
msgid "That is the wrong IM address."
msgstr "Tiu tujmesaĝila adreso estas malĝusta."
#. TRANS: Server error thrown on database error canceling IM address confirmation.
-#, fuzzy
msgid "Couldn't delete confirmation."
-msgstr "Malsukcesis forigi tujmesaĝila agordo."
+msgstr "Malsukcesis forigo de adreskonfirmo."
#. TRANS: Message given after successfully canceling IM address confirmation.
msgid "IM confirmation cancelled."
#. TRANS: Message given trying to remove an IM address that is not
#. TRANS: registered for the active user.
-#, fuzzy
msgid "That is not your screenname."
-msgstr "Tio ne estas via telefonnumero."
+msgstr "Tio ne estas via tujmesaĝila adreso."
#. TRANS: Server error thrown on database error removing a registered IM address.
-#, fuzzy
msgid "Couldn't update user im prefs."
-msgstr "Malsukcesis ĝisdatigi uzantan informon."
+msgstr "Malsukcesis ĝisdatigo de tujmesaĝaj agordoj de uzanto."
#. TRANS: Message given after successfully removing a registered Instant Messaging address.
msgid "The IM address was removed."
#. TRANS: Form validation message when providing an e-mail address that does not validate.
#. TRANS: %s is an invalid e-mail address.
-#, fuzzy, php-format
+#, php-format
msgid "Invalid email address: %s."
-msgstr "Nevalida retpoŝtadreso: %s"
+msgstr "Nevalida retpoŝtadreso: %s."
#. TRANS: Page title when invitations have been sent.
-#, fuzzy
msgid "Invitations sent"
msgstr "Invito(j) senditas"
#. TRANS: Client error displayed specifying an invalid license URL in the license admin panel.
msgid "Invalid license URL."
-msgstr ""
+msgstr "Nevalida URL de permesilo."
#. TRANS: Client error displayed specifying an invalid license image URL in the license admin panel.
+#, fuzzy
msgid "Invalid license image URL."
-msgstr ""
+msgstr "Nevalida URL de bildo de permesilo."
#. TRANS: Client error displayed specifying an invalid license URL in the license admin panel.
+#, fuzzy
msgid "License URL must be blank or a valid URL."
-msgstr ""
+msgstr "URL de permesilo devas foresti aŭ esti valida URL."
#. TRANS: Client error displayed specifying an invalid license image URL in the license admin panel.
+#, fuzzy
msgid "License image must be blank or valid URL."
-msgstr ""
+msgstr "URL de bildo de permesilo devas foresti aŭ esti valida URL."
#. TRANS: Form legend in the license admin panel.
msgid "License selection"
msgstr "Aŭtomate ensaluti estonte; ne taŭge por komuna komputilo!"
#. TRANS: Button text for log in on login page.
-#, fuzzy
msgctxt "BUTTON"
msgid "Login"
msgstr "Ensaluti"
msgid "Could not create application."
msgstr "Malsukcesis krei aplikaĵon."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Grando nevalida."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Nova grupo"
#. TRANS: Client exception thrown when a user tries to create a group while banned.
-#, fuzzy
msgid "You are not allowed to create groups on this site."
-msgstr "Vi ne estas grupano."
+msgstr "Vi ne rajtas krei grupojn en ĉi tiu retpaĝaro."
#. TRANS: Form instructions for group create form.
msgid "Use this form to create a new group."
#. TRANS: Client error displayed trying to send a direct message to a user while sender and
#. TRANS: receiver are not subscribed to each other.
-#, fuzzy
msgid "You cannot send a message to this user."
-msgstr "Vi ne povas sendi mesaĝon al la uzanto."
+msgstr "Vi ne povas sendi mesaĝon al tiu uzanto."
#. TRANS: Form validator error displayed trying to send a direct message without content.
#. TRANS: Client error displayed trying to send a notice without content.
#. TRANS: %s is a path.
#, fuzzy, php-format
msgid "\"%s\" not found."
-msgstr "Metodo de API ne troviĝas."
+msgstr "\"%s\" ne trovitas."
#. TRANS: Server error displayed in oEmbed action when notice not found.
#. TRANS: %s is a notice.
-#, fuzzy, php-format
+#, php-format
msgid "Notice %s not found."
-msgstr "Metodo de API ne troviĝas."
+msgstr "Avizo %s ne trovitas."
#. TRANS: Server error displayed in oEmbed action when notice has not profile.
msgid "Notice has no profile."
msgstr ""
"Tio ĉi estas via elirkesto, kie listiĝas privataj mesaĝoj, kiujn vi sendis."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Ŝanĝi pasvorton"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Ŝanĝi vian pasvorton."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Pasvorta ŝanĝo"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Malnova pasvorto"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nova pasvorto"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 aŭ pli da literoj"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Konfirmi"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Same kiel pasvorto supra"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Ŝanĝi"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Pasvorto devas esti 6-litera aŭ pli longa."
msgid "Passwords don't match."
msgstr "La pasvortoj diferencas."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Neĝusta malnova pasvorto"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Eraris konservi uzanton: nevalida."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Malsukcesis konservi novan pasvorton."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Pasvorto konservitas."
msgid "Server"
msgstr "Servilo"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Gastigserva Nomo de la retejo"
msgid "Path"
msgstr "Vojo"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "Reteja vojo"
msgid "Locale directory"
msgstr "Dosierujo de lokaĵaro"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Vojo de dosierujo al lokaĵaroj."
msgid "Fancy URLs"
msgstr "Tajlora URL"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Ĉu uzi tajloran (pli facile legebla kaj memorebla) URL?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Temo"
msgstr "Dosierujo kie aldonaĵoj estas."
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "\"SSL\""
msgid "People search"
msgstr "Persona serĉado"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Ne valida persona markilo: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Uzantoj sinmarkitaj per %1$s - paĝo %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "La ago akceptas nur POST-an peton."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Vi ne povas forigi uzantojn."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Ne estas tiu paĝo."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Kromprogramo"
msgid "Default plugins"
msgstr "Defaŭlta lingvo"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Nevalida avizo-enhavo"
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "Aviza permesilo ‘%1$s’ ne konformas al reteja permesilo ‘%2$s’."
#. TRANS: Page title for profile settings.
msgstr "Lingvo"
#. TRANS: Tooltip for dropdown list label in form for profile settings.
-#, fuzzy
msgid "Preferred language."
-msgstr "Preferata lingvo"
+msgstr "Preferata lingvo."
#. TRANS: Dropdownlist label in form for profile settings.
msgid "Timezone"
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Nevalida markilo: \"%s\""
msgid "Restore account"
msgstr "Krei konton"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Trans paĝolimo (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Malsukcesis ricevi publikan fluon"
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Publika tempstrio, paĝo %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Publika tempstrio"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Publika fluo (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Publika fluo (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Publika fluo (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Tio ĉi estas la publika tempstrio de %%site.name%%, sed ankoraŭ neniu afiŝis "
"ion ajn."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Estu la unua afiŝanto!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr "Kial ne [krei konton](%%action.register%%) kaj esti la unua afiŝanto!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"net/). [Aniĝu](%%action.register%%) por konigi novaĵon pri vi mem al viaj "
"amikoj, familianoj, kaj kolegoj! ([Pli](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "No notice specified."
msgstr "Neniu profilo specifiĝas."
-#, fuzzy
msgid "You cannot repeat your own notice."
msgstr "Vi ne povas ripeti vian propran avizon."
#. TRANS: Client exception displayed when trying to restore an account while not logged in.
#, fuzzy
msgid "Only logged-in users can restore their account."
-msgstr "Nur ensalutinto rajtas ripeti avizon."
+msgstr "Nur ensalutintoj rajtas restarigi sian konton."
#. TRANS: Client exception displayed when trying to restore an account without having restore rights.
#, fuzzy
#. TRANS: Client exception. No file; probably just a non-AJAX submission.
#, fuzzy
msgid "No uploaded file."
-msgstr "Alŝuti dosieron"
+msgstr "Malestas alŝutita dosiero."
#. TRANS: Client exception thrown when an uploaded file is larger than set in php.ini.
msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini."
msgid "%1$s group, page %2$d"
msgstr "Grupo %1$s, paĝo %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Noto"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Alnomo"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Grupaj agoj"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Avizo viŝiĝas"
+#, fuzzy
+msgid "Notice"
+msgstr "Avizoj"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Etikedo %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Uzanta profilo"
msgid "Tag user"
msgstr "Etikedi uzanton"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Etikedoj por ĉi tiuj uzanto (literoj, ciferoj, -, . Kaj _), apartigu per "
"komo aŭ spaco."
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Nevalida markilo: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr "Vi rajtas entikedi nur abonanton aŭ abonaton."
msgstr "Nenio"
msgid "[internal]"
-msgstr ""
+msgstr "[interna]"
#. TRANS: Label for dropdown with URL shortener services.
msgid "Shorten URLs with"
msgid "Automatic shortening service to use."
msgstr "Uzota aŭtomata mallongigad-servo."
+#, fuzzy
msgid "URL longer than"
-msgstr ""
+msgstr "URL pli longa, ol"
msgid "URLs longer than this will be shortened, 0 means always shorten."
-msgstr ""
+msgstr "URLoj pli longaj ol tio mallongigatos, uzu «0» por ĉiam mallongigi."
+#, fuzzy
msgid "Text longer than"
-msgstr ""
+msgstr "Teksto pli longa, ol"
msgid ""
"URLs in notices longer than this will be shortened, 0 means always shorten."
msgstr ""
+"URLoj en avizoj pli longaj, ol tio, mallongigatos; uzu «0» por ĉiam "
+"mallongigi."
#. TRANS: Form validation error for form "Other settings" in user profile.
#, fuzzy
"Vi laŭe jam ricevis eldonon de la GNU Affero Ĝenerala Publika Permesilo. "
"Nekaze, legu %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Kromprogramo"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Nomo"
#. TRANS: %1$s is the member name, %2$s is the subscribed group's name.
#, php-format
msgid "%1$s has joined group %2$s."
-msgstr ""
+msgstr "%1$s aniĝis grupon %2$s."
#. TRANS: Server exception thrown when updating a local group fails.
msgid "Could not update local group."
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Nekonata ago"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Forigante uzanton..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Redakti profilan agordon"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Redakti"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Sendi rektan mesaĝon a ĉi tiu uzanto"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Mesaĝo"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderigi"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Uzanta rolo"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administranto"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderanto"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Malsukcesas forigi desegnan agordon."
+#, fuzzy
+msgid "Home"
+msgstr "Hejmpaĝo"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Baza reteja agordo"
#. TRANS: Server exception thrown when using the method setActivitySubject() in the class Atom10Feed.
#, fuzzy
msgid "Do not use this method!"
-msgstr "Ne forigi la avizon"
+msgstr "Ne uzu ĉi tiun metodon!"
#. TRANS: Title.
msgid "Notices where this attachment appears"
#. TRANS: Exception thrown when a password change fails.
#, fuzzy
msgid "Password changing failed."
-msgstr "La ŝanĝo de pasvorto maltrafis"
+msgstr "Ŝanĝo de pasvorto malsukcesis."
#. TRANS: Exception thrown when a password change attempt fails because it is not allowed.
#, fuzzy
#. TRANS: Error message text shown when a favorite could not be set because it has already been favorited.
#, fuzzy
msgid "Could not create favorite: already favorited."
-msgstr "Malsukcesis krei ŝataton."
+msgstr "Malsukcesis krei ŝatmarkon: jam ŝatmarkita."
#. TRANS: Text shown when a notice has been marked as favourite successfully.
msgid "Notice marked as fave."
msgstr[0] "Vi estas grupano de jena grupo:"
msgstr[1] "Vi estas grupano de jenaj grupoj:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Komandoj:\n"
-"on — ŝalti sciigon;\n"
-"off — malŝalti sciigon;\n"
-"help — montri ĉi tiun helpon;\n"
-"follow <nickname> — aboni uzanton;\n"
-"groups — listigi grupojn, kiujn vi aniĝis;\n"
-"subscriptions — listigi viajn abonatojn;\n"
-"subscribers — listigi viajn abonantojn;\n"
-"leave <nickname> — malaboni uzanton;\n"
-"d <nickname> <text> — sendi rektan mesaĝon al uzanto;\n"
-"get <nickname> — legi la lastan avizon de uzanto;\n"
-"whois <nickname> — legi profilan informon pri uzanto;\n"
-"lose <nickname> — ĉesigi la uzanton de sekvi vin;\n"
-"fav <nickname> — ŝati la lastan avizon de uzanto;\n"
-"fav #<notice_id> — ŝati la avizon kun la ID;\n"
-"repeat #<notice_id> — ripeti la avizon kun la ID;\n"
-"repeat <nickname> — ripeti la lastan avizon de uzanto;\n"
-"reply #<notice_id> — respondi la avizon kun la ID;\n"
-"reply <nickname> — respondi la lastan avizon de uzanto;\n"
-"join <group> — aniĝi al grupo;\n"
-"login — havi ligilon por ensaluti al reta interfaco;\n"
-"drop <group> — foriri el grupo;\n"
-"stats — legi vian staton;\n"
-"stop — same kiel «off»;\n"
-"quit — same kiel «off»;\n"
-"sub <nickname> — same kiel «follow»;\n"
-"unsub <nickname> — same kiel «leave»;\n"
-"last <nickname> — same kiel «get»;\n"
-"on <nickname> — ankoraŭ ne realigita;\n"
-"off <nickname> — ankoraŭ ne realigita;\n"
-"nudge <nickname> — puŝeti la uzanton, ke li ĝisdatigu!\n"
-"invite <phone number> — ankoraŭ ne realigita;\n"
-"track <word> — ankoraŭ ne realigita;\n"
-"untrack <word> — ankoraŭ ne realigita;\n"
-"track off — ankoraŭ ne realigita;\n"
-"untrack all — ankoraŭ ne realigita;\n"
-"tracks — ankoraŭ ne realigita;\n"
-"tracking — ankoraŭ ne realigita;\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Komandaj rezultoj"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Malsukcesis ŝalti sciigon."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Malsukcesis malŝalti sciigon."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Aboni la uzanton"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Malaboni la uzanton"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Rektaj mesaĝoj al %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Profila informo"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Ripeti la avizon"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Respondi ĉi tiun avizon"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Nekonata grupo."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Forigo de grupo"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Komando ankoraŭ ne realigita."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
#, fuzzy
msgid "Database error"
msgstr "Datumbaza eraro"
-#, fuzzy
-msgid "Home"
-msgstr "Hejmpaĝo"
-
msgid "Public"
msgstr "Publika"
msgstr ""
"Loko de la grupo, se iu ajn, ekzemple \"Urbo, Stato (aŭ Regiono), Lando\""
+msgid "Aliases"
+msgstr "Alnomo"
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Aldoni aŭ redakti desegnon de %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Grupaj agoj"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Grupoj kun plej multe da membroj"
#. TRANS Entry in drop-down selection box in direct-message inbox/outbox when no one is available to message.
#, fuzzy
msgid "No mutual subscribers."
-msgstr "Ne abonato!"
+msgstr "Mankas abonantoj reciprokaj."
msgid "To"
msgstr "Al"
msgid "Notice repeated"
msgstr "Avizo ripetiĝas"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Puŝeti la uzanton"
msgid "Couldn't insert new subscription."
msgstr "Eraris enmeti novan abonon."
-#, fuzzy
msgid "Your profile"
-msgstr "Grupa profilo"
+msgstr "Via profilo"
msgid "Replies"
msgstr "Respondoj"
msgid "(Plugin descriptions unavailable when disabled.)"
msgstr ""
-#, fuzzy
msgid "Settings"
-msgstr "SMM-a agordo"
+msgstr "Agordoj"
-#, fuzzy
msgid "Change your personal settings"
-msgstr "Ŝanĝi vian profilan agordon."
+msgstr "Ŝanĝi viajn personajn agordojn"
-#, fuzzy
msgid "Site configuration"
-msgstr "Uzanta agordo"
+msgstr "Retej-agordo"
-#, fuzzy
msgid "Logout"
-msgstr " Elsaluti"
+msgstr "Elsaluti"
-#, fuzzy
msgid "Logout from the site"
-msgstr "Elsaluti el la retejo"
+msgstr "Elsaluti el la retpaĝaro"
#, fuzzy
msgid "Login to the site"
-msgstr "Ensaluti al la retejo"
+msgstr "Ensaluti al la retpaĝaro"
msgid "Search"
msgstr "Serĉi"
-#, fuzzy
msgid "Search the site"
-msgstr "Serĉi ĉe retejo"
+msgstr "Serĉi en la retpaĝaro"
#. TRANS: H2 text for user subscription statistics.
#. TRANS: Label for user statistics.
msgstr "Revoki rolon %s de la uzanto"
#. TRANS: Client error on action trying to visit a non-existing page.
-#, fuzzy
msgid "Page not found."
-msgstr "Metodo de API ne troviĝas."
+msgstr "Paĝo ne trovitas."
msgid "Sandbox"
msgstr "Provejo"
msgstr "URL"
msgid "URL shorteners"
-msgstr ""
+msgstr "Mallongigiloj de URLoj"
msgid "Updates by instant messenger (IM)"
msgstr "Ĝisdatiĝo per tujmesaĝilo."
msgid "User %1$s (%2$d) has no profile record."
msgstr "La uzanto ne havas profilon."
-msgid "Edit Avatar"
-msgstr "Redakti vizaĝbildon"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Nekonata ago"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Forigante uzanton..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Redakti profilan agordon"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Redakti"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Sendi rektan mesaĝon a ĉi tiu uzanto"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Mesaĝo"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderigi"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Uzanta rolo"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administranto"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderanto"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Ne konektita."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "Tempstrio de %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Serĉi homon ĉe la retejo"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Nevalida markilo: \"%s\""
# Author: Brion
# Author: Crazymadlover
# Author: Fitoschido
+# Author: Johnarupire
# Author: Locos epraix
# Author: McDutchie
# Author: Ovruni
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:08+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:55+0000\n"
"Language-Team: Spanish <http://translatewiki.net/wiki/Portal:es>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: es\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
#. TRANS: Client error displayed when the number of bytes in a POST request exceeds a limit.
#. TRANS: %s is the number of bytes of the CONTENT_LENGTH.
#. TRANS: Form validation error in design settings form. POST should remain untranslated.
-#, fuzzy, php-format
+#, php-format
msgid ""
"The server was unable to handle that much POST data (%s byte) due to its "
"current configuration."
"The server was unable to handle that much POST data (%s bytes) due to its "
"current configuration."
msgstr[0] ""
-"El servidor no ha podido manejar tanta información del tipo POST (% de "
+"El servidor no ha podido manejar tanta información del tipo POST (%s de "
"bytes) a causa de su configuración actual."
msgstr[1] ""
-"El servidor no ha podido manejar tanta información del tipo POST (% de "
+"El servidor no ha podido manejar tanta información del tipo POST (%s de "
"bytes) a causa de su configuración actual."
#. TRANS: Client error displayed when saving design settings fails because of an empty id.
#. TRANS: Title for Atom feed.
msgctxt "ATOM"
msgid "Main"
-msgstr ""
+msgstr "Principal"
#. TRANS: Title for Atom feed. %s is a user nickname.
#. TRANS: Message is used as link title. %s is a user nickname.
#. TRANS: Title for Atom feed with a user's favorite notices. %s is a user nickname.
#. TRANS: Title for Atom favorites feed.
#. TRANS: %s is a user nickname.
-#, fuzzy, php-format
+#, php-format
msgid "%s favorites"
-msgstr "Favoritos"
+msgstr "%s Favoritos"
#. TRANS: Title for Atom feed with a user's memberships. %s is a user nickname.
-#, fuzzy, php-format
+#, php-format
msgid "%s memberships"
-msgstr "Miembros del grupo %s"
+msgstr "%s miembros del grupo"
#. TRANS: Client error displayed when users try to block themselves.
msgid "You cannot block yourself!"
#. TRANS: %d is the maximum number of characters for a message.
#. TRANS: Form validation error displayed when message content is too long.
#. TRANS: %d is the maximum number of characters for a message.
-#, fuzzy, php-format
+#, php-format
msgid "That's too long. Maximum message size is %d character."
msgid_plural "That's too long. Maximum message size is %d characters."
-msgstr[0] "Demasiado largo. Tamaño máx. de los mensajes es %d caracteres."
-msgstr[1] "Demasiado largo. Tamaño máx. de los mensajes es %d caracteres."
+msgstr[0] "Muy largo. El tamaño máx. por mensaje es de %d caracteres."
+msgstr[1] "Muy largo. El tamaño máx. por mensaje es de %d caracteres."
#. TRANS: Client error displayed if a recipient user could not be found (403).
msgid "Recipient user not found."
msgstr "No se encuentra usuario receptor."
#. TRANS: Client error displayed trying to direct message another user who's not a friend (403).
-#, fuzzy
msgid "Cannot send direct messages to users who aren't your friend."
-msgstr "No se puede enviar mensajes directos a usuarios que no son tu amigo."
+msgstr "No puedes enviar mensajes directos a usuarios que no son tus amigos."
#. TRANS: Client error displayed trying to direct message self (403).
-#, fuzzy
msgid ""
"Do not send a message to yourself; just say it to yourself quietly instead."
-msgstr "No te auto envíes un mensaje; dícetelo a ti mismo."
+msgstr "No te envíes un mensaje a ti mismo; sólo dilo para ti en voz baja."
#. TRANS: Client error displayed when requesting a status with a non-existing ID.
#. TRANS: Client error displayed when trying to remove a favourite with an invalid ID.
msgstr "No puedes dejar de seguirte a ti mismo."
#. TRANS: Client error displayed when supplying invalid parameters to an API call checking if a friendship exists.
-#, fuzzy
msgid "Two valid IDs or nick names must be supplied."
-msgstr "Deben proveerse dos IDs válidos o nombres en pantalla."
+msgstr "Son necesarios dos nombres de usuario o IDs válidos."
#. TRANS: Client error displayed when a source user could not be determined showing friendship.
msgid "Could not determine source user."
#. TRANS: Group edit form validation error.
#. TRANS: Group create form validation error.
#. TRANS: Validation error in form for profile settings.
-#, fuzzy
msgid "Full name is too long (maximum 255 characters)."
-msgstr "Tu nombre es demasiado largo (max. 255 carac.)"
+msgstr "Nombre demasiado largo (max. 255 carac.)"
#. TRANS: Client error shown when providing too long a description during group creation.
#. TRANS: %d is the maximum number of allowed characters.
#. TRANS: %d is the maximum number of characters for the description.
#. TRANS: Group create form validation error.
#. TRANS: %d is the maximum number of allowed characters.
-#, fuzzy, php-format
+#, php-format
msgid "Description is too long (maximum %d character)."
msgid_plural "Description is too long (maximum %d characters)."
-msgstr[0] "La descripción es demasiado larga (máx. %d caracteres)."
-msgstr[1] "La descripción es demasiado larga (máx. %d caracteres)."
+msgstr[0] "Descripción demasiado larga (máx. %d caracteres)."
+msgstr[1] "Descripción demasiado larga (máx. %d caracteres)."
#. TRANS: Client error shown when providing too long a location during group creation.
#. TRANS: API validation exception thrown when location does not validate.
#. TRANS: Group edit form validation error.
#. TRANS: Group create form validation error.
#. TRANS: Validation error in form for profile settings.
-#, fuzzy
msgid "Location is too long (maximum 255 characters)."
-msgstr "La ubicación es demasiado larga (máx. 255 caracteres)."
+msgstr "Ubicación demasiado larga (máx. 255 caracteres)."
#. TRANS: Client error shown when providing too many aliases during group creation.
#. TRANS: %d is the maximum number of allowed aliases.
#. TRANS: %d is the maximum number of allowed aliases.
#. TRANS: Group create form validation error.
#. TRANS: %d is the maximum number of allowed aliases.
-#, fuzzy, php-format
+#, php-format
msgid "Too many aliases! Maximum %d allowed."
msgid_plural "Too many aliases! Maximum %d allowed."
-msgstr[0] "¡Muchos seudónimos! El máximo es %d."
-msgstr[1] "¡Muchos seudónimos! El máximo es %d."
+msgstr[0] "¡Muchos seudónimos! el máximo es %d."
+msgstr[1] "¡Muchos seudónimos! el máximo permitido es %d."
#. TRANS: Client error shown when providing an invalid alias during group creation.
#. TRANS: %s is the invalid alias.
msgid "%s's groups"
msgstr "Grupos de %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
-#, php-format
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
+#, fuzzy, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%1$s grupos %2$s es un miembro de."
#. TRANS: API validation exception thrown when alias is the same as nickname.
#. TRANS: Group create form validation error.
-#, fuzzy
msgid "Alias cannot be the same as nickname."
-msgstr "El alias no puede ser el mismo que el usuario."
+msgstr "El alias no puede ser el igual al nombre de usuario."
#. TRANS: Client error displayed when uploading a media file has failed.
msgid "Upload failed."
msgstr "Cancelar"
#. TRANS: Button text that when clicked will allow access to an account by an external application.
-#, fuzzy
msgctxt "BUTTON"
msgid "Allow"
msgstr "Permitir"
#. TRANS: Form instructions.
-#, fuzzy
msgid "Authorize access to your account information."
-msgstr "Permitir o denegar el acceso a la información de tu cuenta."
+msgstr "Permitir el acceso a la información de tu cuenta."
#. TRANS: Header for user notification after revoking OAuth access to an application.
-#, fuzzy
msgid "Authorization canceled."
-msgstr "Confirmación de mensajería instantánea cancelada."
+msgstr "Autorización cancelada"
#. TRANS: User notification after revoking OAuth access to an application.
#. TRANS: %s is an OAuth token.
msgstr "El token de solicitud %2 ha sido denegado y revocado."
#. TRANS: Title of the page notifying the user that an anonymous client application was successfully authorized to access the user's account with OAuth.
-#, fuzzy
msgid "You have successfully authorized the application"
-msgstr "No estás autorizado."
+msgstr "Has autorizado satisfactoriamente la aplicación."
#. TRANS: Message notifying the user that an anonymous client application was successfully authorized to access the user's account with OAuth.
msgid ""
"Please return to the application and enter the following security code to "
"complete the process."
msgstr ""
+"Por favor, vuelva a la aplicación e introduzca el siguiente código de "
+"seguridad para terminar el proceso."
#. TRANS: Title of the page notifying the user that the client application was successfully authorized to access the user's account with OAuth.
#. TRANS: %s is the authorised application name.
-#, fuzzy, php-format
+#, php-format
msgid "You have successfully authorized %s"
-msgstr "No estás autorizado."
+msgstr "Has sido autorizado correctamente %s"
#. TRANS: Message notifying the user that the client application was successfully authorized to access the user's account with OAuth.
#. TRANS: %s is the authorised application name.
"Please return to %s and enter the following security code to complete the "
"process."
msgstr ""
+"Por favor, regrese a %s e ingrese el siguiente código de seguridad para "
+"completar el proceso."
#. TRANS: Client error displayed trying to delete a status not using POST or DELETE.
#. TRANS: POST and DELETE should not be translated.
#. TRANS: Exception thrown requesting an unsupported notice output format.
#. TRANS: %s is the requested output format.
-#, fuzzy, php-format
+#, php-format
msgid "Unsupported format: %s."
-msgstr "Formato no soportado."
+msgstr "Formato no soportado: %s"
#. TRANS: Client error displayed requesting a deleted status.
msgid "Status deleted."
#. TRANS: Client error displayed when trying to delete a notice not using the Atom format.
msgid "Can only delete using the Atom format."
-msgstr ""
+msgstr "Sólo se puede eliminar usando el formato Atom."
#. TRANS: Client error displayed when a user has no rights to delete notices of other users.
#. TRANS: Error message displayed trying to delete a notice that was not made by the current user.
-#, fuzzy
msgid "Cannot delete this notice."
msgstr "No se puede eliminar este mensaje."
#. TRANS: Confirmation of notice deletion in API. %d is the ID (number) of the deleted notice.
-#, fuzzy, php-format
+#, php-format
msgid "Deleted notice %d"
-msgstr "Borrar mensaje"
+msgstr "Aviso eliminado %d"
#. TRANS: Client error displayed when the parameter "status" is missing.
msgid "Client must provide a 'status' parameter with a value."
#. TRANS: Client error displayed when the parameter "status" is missing.
#. TRANS: %d is the maximum number of character for a notice.
-#, fuzzy, php-format
+#, php-format
msgid "That's too long. Maximum notice size is %d character."
msgid_plural "That's too long. Maximum notice size is %d characters."
-msgstr[0] "El mensaje es muy largo. El tamaño máximo es de %d caracteres."
-msgstr[1] "El mensaje es muy largo. El tamaño máximo es de %d caracteres."
+msgstr[0] "Demasiado largo. El tamaño máximo es de %d caracteres."
+msgstr[1] "Demasiado largo. El tamaño máximo es de %d caracteres."
#. TRANS: Client error displayed when replying to a non-existing notice.
#, fuzzy
msgstr "Actualizaciones etiquetadas con %1$s en %2$s!"
#. TRANS: Client error displayed trying to add a notice to another user's timeline.
-#, fuzzy
msgid "Only the user can add to their own timeline."
-msgstr "Sólo el usuario puede leer sus bandejas de correo."
+msgstr "Sólo el usuario puede leer su línea de tiempo."
#. TRANS: Client error displayed when using another format than AtomPub.
msgid "Only accept AtomPub for Atom feeds."
#. TRANS: Client error displayed when not using the POST verb. Do not translate POST.
msgid "Can only handle POST activities."
-msgstr ""
+msgstr "Solo se puede gestionar las actividades en POST"
#. TRANS: Client error displayed when using an unsupported activity object type.
#. TRANS: %s is the unsupported activity object type.
msgstr "Sólo se pueden preferir los avisos."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
-msgstr "Nota desconocida."
+msgid "Unknown notice."
+msgstr "Aviso desconocido."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
msgid "Already a favorite."
#. TRANS: Client exception thrown when trying to subscribe to group while blocked from that group.
msgid "Blocked by admin."
-msgstr ""
+msgstr "Bloqueado por el administrador"
#. TRANS: Client exception thrown when referencing a non-existing favorite.
#, fuzzy
#. TRANS: Client error displayed when not using the follow verb.
msgid "Can only handle Follow activities."
-msgstr ""
+msgstr "Sólo es posible gestionar las actividades que sigues"
#. TRANS: Client exception thrown when subscribing to an object that is not a person.
msgid "Can only follow people."
-msgstr ""
+msgstr "Sólo puede seguir personas"
#. TRANS: Client exception thrown when subscribing to a non-existing profile.
#. TRANS: %s is the unknown profile ID.
#. TRANS: Client error displayed trying to subscribe to an already subscribed profile.
#. TRANS: %s is the profile the user already has a subscription on.
-#, fuzzy, php-format
+#, php-format
msgid "Already subscribed to %s."
-msgstr "¡Ya te has suscrito!"
+msgstr "Ya está suscrito a %s"
#. TRANS: Client error displayed trying to get a non-existing attachment.
msgid "No such attachment."
msgstr "Ningún archivo fue subido."
#. TRANS: Avatar upload form instruction after uploading a file.
-#, fuzzy
msgid "Pick a square area of the image to be your avatar."
-msgstr "Elige un área cuadrada para que sea tu imagen"
+msgstr "Selecciona un área de la imagen para que sea tu avatar."
#. TRANS: Server error displayed if an avatar upload went wrong somehow server side.
#. TRANS: Server error displayed trying to crop an uploaded group logo that is no longer present.
#. TRANS: Title for backup account page.
#. TRANS: Option in profile settings to create a backup of the account of the currently logged in user.
msgid "Backup account"
-msgstr ""
+msgstr "Cuenta de respaldo (backup)"
#. TRANS: Client exception thrown when trying to backup an account while not logged in.
-#, fuzzy
msgid "Only logged-in users can backup their account."
-msgstr "Sólo los usuarios que hayan accedido pueden repetir mensajes."
+msgstr ""
+"Sólo los usuarios que hayan accedido pueden hacer una copia de seguridad "
+"(backup) de sus cuentas."
#. TRANS: Client exception thrown when trying to backup an account without having backup rights.
msgid "You may not backup your account."
#. TRANS: Title for submit button to backup an account on the backup account page.
msgid "Backup your account."
-msgstr ""
+msgstr "Hacer una copia de seguridad de su cuenta"
#. TRANS: Client error displayed when blocking a user that has already been blocked.
msgid "You already blocked that user."
msgstr "No"
#. TRANS: Submit button title for 'No' when blocking a user.
-#, fuzzy
msgid "Do not block this user."
msgstr "No bloquear a este usuario"
msgstr "Desbloquear usuario de grupo"
#. TRANS: Button text for unblocking a user from a group.
-#, fuzzy
msgctxt "BUTTON"
msgid "Unblock"
msgstr "Desbloquear"
msgstr "No eliminar este grupo"
#. TRANS: Submit button title for 'Yes' when deleting a group.
-#, fuzzy
msgid "Delete this group."
-msgstr "Borrar este grupo"
+msgstr "Eliminar este grupo."
#. TRANS: Error message displayed trying to delete a notice while not logged in.
#. TRANS: Client error displayed when trying to remove a favorite while not logged in.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgstr "¿Estás seguro de que quieres eliminar este aviso?"
#. TRANS: Submit button title for 'No' when deleting a notice.
-#, fuzzy
msgid "Do not delete this notice."
-msgstr "No eliminar este mensaje"
+msgstr "No eliminar este mensaje."
#. TRANS: Submit button title for 'Yes' when deleting a notice.
-#, fuzzy
msgid "Delete this notice."
-msgstr "Borrar este mensaje"
+msgstr "Eliminar este mensaje"
#. TRANS: Client error displayed when trying to delete a user without having the right to delete users.
msgid "You cannot delete users."
"To send notices via email, we need to create a unique email address for you "
"on this server:"
msgstr ""
+"Para enviar avisos vía correo electrónico, necesitamos crear una dirección "
+"de correo electrónico exclusiva para usted en este servidor."
#. TRANS: Button label for adding an e-mail address to send notices from.
#. TRANS: Button label for adding an SMS e-mail address to send notices from.
#. TRANS: Submit button title.
msgctxt "TOOLTIP"
msgid "Block this user"
-msgstr ""
+msgstr "Bloquear a este usuario"
#. TRANS: Form legend for form to make a user a group admin.
msgid "Make user an admin of the group"
msgstr "¡Actualizaciones de miembros de %1$s en %2$s!"
#. TRANS: Title for first page of the groups list.
-#, fuzzy
msgctxt "TITLE"
msgid "Groups"
msgstr "Grupos"
#. TRANS: Additional text on page where groups can be searched if no results were found for a query for a logged in user.
#. TRANS: This message contains Markdown links in the form [link text](link).
-#, fuzzy, php-format
+#, php-format
msgid ""
"If you cannot find the group you're looking for, you can [create it](%%"
"action.newgroup%%) yourself."
msgstr ""
-"Si no puedes encontrar el grupo que estás buscando, puedes [crearlo](%%"
-"action.newgroup%%) tú mismo."
+"Si no encuentras el grupo que estás buscando, puedes [crearlo](%%action."
+"newgroup%%) tú mismo."
#. TRANS: Additional text on page where groups can be searched if no results were found for a query for a not logged in user.
#. TRANS: This message contains Markdown links in the form [link text](link).
#. TRANS: Instant messaging settings page instructions.
#. TRANS: [instant messages] is link text, "(%%doc.im%%)" is the link.
#. TRANS: the order and formatting of link text and link should remain unchanged.
-#, fuzzy, php-format
+#, php-format
msgid ""
"You can send and receive notices through instant messaging [instant messages]"
"(%%doc.im%%). Configure your addresses and settings below."
msgstr ""
-"Puedes enviar y recibir avisos vía [mensajes instantáneos](%%doc.im%%) de "
+"Puedes enviar y recibir mensajes vía [mensajería instantána](%%doc.im%%) de "
"Jabber/GTalk. Configura tu dirección y opciones abajo."
#. TRANS: Message given in the IM settings if IM is not enabled on the site.
msgid "IM is not available."
msgstr "La mensajería instantánea no está disponible."
-#, fuzzy, php-format
+#, php-format
msgid "Current confirmed %s address."
-msgstr "Actual dirección de correo electrónico confirmada"
+msgstr "Actual dirección de correo electrónico %s confirmada"
#. TRANS: Form note in IM settings form.
#. TRANS: %s is the IM address set for the site.
-#, fuzzy, php-format
+#, php-format
msgid ""
"Awaiting confirmation on this address. Check your %s account for a message "
"with further instructions. (Did you add %s to your buddy list?)"
msgstr ""
-"A la espera de una confirmación para esta dirección. Busca en tu cuenta "
-"Jabber/GTalk un mensaje con más instrucciones. (¿Has añadido a %s a tu lista "
-"de amigos?)"
+"Esperando confirmación para esta dirección. Revisa tu cuenta Jabber/GTalk un "
+"mensaje con más instrucciones. (¿Has añadido a %s a tu lista de amigos?)"
msgid "IM address"
msgstr "Dirección de mensajería instantánea"
#. TRANS: Form validation message when providing an e-mail address that does not validate.
#. TRANS: %s is an invalid e-mail address.
-#, fuzzy, php-format
+#, php-format
msgid "Invalid email address: %s."
msgstr "Dirección de correo electrónico inválida: %s"
#. TRANS: Page title when invitations have been sent.
-#, fuzzy
msgid "Invitations sent"
-msgstr "Invitacion(es) enviada(s)"
+msgstr "Invitación(es) enviada(s)"
#. TRANS: Page title when inviting potential users.
msgid "Invite new users"
#. TRANS: Form instructions for the site license admin panel.
msgid "License for this StatusNet site"
-msgstr ""
+msgstr "Licencia para este sitio de StatusNet"
#. TRANS: Client error displayed selecting an invalid license in the license admin panel.
msgid "Invalid license selection."
-msgstr ""
+msgstr "Selección de licencia incorrecta"
#. TRANS: Client error displayed when not specifying an owner for the all rights reserved license in the license admin panel.
msgid ""
#. TRANS: Form legend in the license admin panel.
msgid "License selection"
-msgstr ""
+msgstr "Selección de Licencia"
#. TRANS: License option in the license admin panel.
msgid "Private"
#. TRANS: License option in the license admin panel.
msgid "All Rights Reserved"
-msgstr ""
+msgstr "Todos los derechos reservados"
#. TRANS: License option in the license admin panel.
msgid "Creative Commons"
-msgstr ""
+msgstr "Creative Commons"
#. TRANS: Dropdown field label in the license admin panel.
msgid "Type"
#. TRANS: Form legend in the license admin panel.
msgid "License details"
-msgstr ""
+msgstr "Detalles de la licencia"
#. TRANS: Field label in the license admin panel.
msgid "Owner"
-msgstr ""
+msgstr "Propietario"
#. TRANS: Field title in the license admin panel.
msgid "Name of the owner of the site's content (if applicable)."
"compartidos! "
#. TRANS: Button text for log in on login page.
-#, fuzzy
msgctxt "BUTTON"
msgid "Login"
-msgstr "Inicio de sesión"
+msgstr "Iniciar sesión"
#. TRANS: Link text for link to "reset password" on login page.
msgid "Lost or forgotten password?"
msgid "Could not create application."
msgstr "No se pudo crear la aplicación."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Tamaño inválido."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Grupo nuevo "
msgstr ""
"Ésta es tu bandeja de salida, incluye la lista de mensajes privados enviados."
+#. TRANS: Title for page where to change password.
+msgctxt "TITLE"
msgid "Change password"
msgstr "Cambiar contraseña"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Cambia tu contraseña"
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Cambio de contraseña"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Antigua contraseña"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nueva contraseña"
-#, fuzzy
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
-msgstr "6 o más caracteres"
+msgstr "6 o más caracteres."
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Confirmar"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
-#, fuzzy
msgid "Same as password above."
-msgstr "Igual a la contraseña de arriba"
+msgstr "Igual a la contraseña de arriba."
+#. TRANS: Button text on page where to change password.
+msgctxt "BUTTON"
msgid "Change"
msgstr "Cambiar"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "La contraseña debe tener 6 o más caracteres."
msgid "Passwords don't match."
msgstr "Las contraseñas no coinciden"
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+msgid "Incorrect old password."
msgstr "Contraseña antigua incorrecta."
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Error al guardar el usuario; inválido."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
-#, fuzzy
msgid "Cannot save new password."
msgstr "No se puede guardar la nueva contraseña."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Se guardó la contraseña."
msgid "Server"
msgstr "Servidor"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Nombre del host del servidor del sitio."
msgid "Path"
msgstr "Ruta"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "Ruta del sitio"
msgid "Locale directory"
msgstr "Directorio de temas"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Directory path to locales."
msgstr "Ruta del directorio de las configuraciones locales"
msgid "Fancy URLs"
msgstr "URL agradables"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "¿Usar URL amigables (más legibles y memorizables)?"
+#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Tema"
msgstr "Tema para el sitio."
#. TRANS: Tooltip for field label in Paths admin panel.
-#, fuzzy
msgid "Web path to attachments."
-msgstr "Sin archivo adjunto"
+msgstr "Ruta de acceso a los adjuntos"
#. TRANS: Tooltip for field label in Paths admin panel.
#, fuzzy
msgstr "Ruta del directorio de las configuraciones locales"
#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgstr "Usar SSL"
#. TRANS: Tooltip for field label in Paths admin panel.
-#, fuzzy
msgid "When to use SSL."
-msgstr "Cuándo utilizar SSL"
+msgstr "Cuándo utilizar SSL."
#. TRANS: Tooltip for field label in Paths admin panel.
-#, fuzzy
msgid "Server to direct SSL requests to."
-msgstr "Servidor hacia el cual dirigir las solicitudes SSL"
+msgstr "Servidor hacia el cual dirigir las solicitudes SSL."
#. TRANS: Button title text to store form data in the Paths admin panel.
msgid "Save paths"
msgid "People search"
msgstr "Buscador de gente"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "No es una etiqueta válida para personas: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Usuarios auto etiquetados con %1$s - página %2$d"
#. TRANS: Page title for AJAX form return when a disabling a plugin.
msgctxt "plugin"
msgid "Disabled"
-msgstr ""
+msgstr "Deshabilitado"
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Esta acción sólo acepta solicitudes POST."
-#, fuzzy
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
msgid "You cannot administer plugins."
-msgstr "No puedes borrar usuarios."
+msgstr "Usted no puede administrar los plugins."
-#, fuzzy
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
msgid "No such plugin."
-msgstr "No existe tal página."
+msgstr "El plugin no existe."
#. TRANS: Page title for AJAX form return when enabling a plugin.
msgctxt "plugin"
msgid "Enabled"
-msgstr ""
+msgstr "Habilitado"
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+msgctxt "TITLE"
msgid "Plugins"
-msgstr "Complementos"
+msgstr "Plugins"
#. TRANS: Instructions at top of plugin admin page.
msgid ""
msgid "Default plugins"
msgstr "!Idioma predeterminado"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Contenido de mensaje inválido."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"La licencia del mensaje %1$s’ es incompatible con la licencia del sitio ‘%2"
"$s’."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Etiqueta inválida: \"% s\""
#. TRANS: Option in profile settings to restore the account of the currently logged in user from a backup.
#. TRANS: Page title for page where a user account can be restored from backup.
-#, fuzzy
msgid "Restore account"
-msgstr "Crear una cuenta"
+msgstr "Restaurar cuenta"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Más allá del límite de páginas (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "No se pudo acceder a corriente pública."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Línea temporal pública, página %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Línea temporal pública"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Canal público (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Canal público (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Canal público (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Esta es la línea temporal pública de %%site.name%%, pero aún no se ha "
"publicado nada."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "¡Sé la primera persona en publicar algo!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"¿Por qué no [registras una cuenta](%%action.register%%) y te conviertes en "
"la primera persona en publicar?"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"para compartir notas acerca de tí con tus amistades, familiares y "
"compañeros!! ([Más información](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
#. TRANS: Instructions (more used like an explanation/header).
#. TRANS: %s is the StatusNet sitename.
-#, fuzzy, php-format
+#, php-format
msgid "These are most popular recent tags on %s"
-msgstr "Estas son las etiquetas recientes más populares en %s "
+msgstr "Estas son las etiquetas recientes más populares en %s"
#. TRANS: This message contains a Markdown URL. The link description is between
#. TRANS: square brackets, and the link between parentheses. Do not separate "]("
msgstr "Recuperar"
#. TRANS: Button text on password recovery page.
-#, fuzzy
msgctxt "BUTTON"
msgid "Recover"
msgstr "Recuperar"
msgstr "Recuperación de contraseña solicitada"
#. TRANS: Title for password recovery page in password saved mode.
-#, fuzzy
msgid "Password saved"
-msgstr "Se guardó la contraseña."
+msgstr "Contraseña guardada."
#. TRANS: Title for password recovery page when an unknown action has been specified.
msgid "Unknown action"
msgstr "Acción desconocida"
#. TRANS: Title for field label for password reset form.
-#, fuzzy
msgid "6 or more characters, and do not forget it!"
-msgstr "6 o más caracteres, ¡no te olvides!"
+msgstr "6 o más caracteres, ¡y no la olvides!"
#. TRANS: Button text for password reset form.
#. TRANS: Button text on profile design page to reset all colour settings to default without saving.
-#, fuzzy
msgctxt "BUTTON"
msgid "Reset"
msgstr "Restablecer"
msgstr "Restablecimiento de contraseña inesperado."
#. TRANS: Reset password form validation error message.
-#, fuzzy
msgid "Password must be 6 characters or more."
msgstr "La contraseña debe tener 6 o más caracteres."
msgid "No id parameter"
msgstr "No existe argumento de ID."
-#, fuzzy, php-format
+#, php-format
msgid "No such file \"%d\""
-msgstr "No existe tal archivo."
+msgstr "No existe el archivo %d"
msgid "Sorry, only invited people can register."
msgstr "Disculpa, sólo personas invitadas pueden registrarse."
msgid "Registration not allowed."
msgstr "Registro de usuario no permitido."
-#, fuzzy
msgid "You cannot register if you don't agree to the license."
msgstr "No puedes registrarte si no estás de acuerdo con la licencia."
msgid "Invalid username or password."
msgstr "Usuario o contraseña inválidos."
-#, fuzzy
msgid ""
"With this form you can create a new account. You can then post notices and "
"link up to friends and colleagues."
msgstr ""
"Con este formulario puedes crear una nueva cuenta. Después podrás publicar "
-"avisos y enviar vínculos de ellos a tus amigos y colegas. "
+"mensajes y enviar vínculos de ellos a tus amigos y colegas."
msgid "Email"
msgstr "Correo electrónico"
-#, fuzzy
msgid "Used only for updates, announcements, and password recovery."
msgstr ""
-"Se usa sólo para actualizaciones, anuncios y recuperación de contraseñas"
+"Sólo se usa para actualizaciones, anuncios y recuperación de contraseñas"
-#, fuzzy
msgid "Longer name, preferably your \"real\" name."
-msgstr "Nombre más largo, preferiblemente tu nombre \"real\""
+msgstr "Nombre largo, preferiblemente tu nombre \"real\""
-#, fuzzy
msgid "Where you are, like \"City, State (or Region), Country\"."
msgstr "Dónde estás, por ejemplo \"Ciudad, Estado (o Región), País\""
msgid "User nickname"
msgstr "Usuario"
-#, fuzzy
msgid "Nickname of the user you want to follow."
msgstr "Usuario a quien quieres seguir"
msgstr ""
#. TRANS: Title for submit button to confirm upload of a user backup file for account restore.
-#, fuzzy
msgid "Upload the file"
-msgstr "Subir archivo"
+msgstr "Subir el archivo"
msgid "You cannot revoke user roles on this site."
msgstr "No puedes revocar funciones de usuario en este sitio."
msgid "%1$s group, page %2$d"
msgstr "grupo %1$s, página %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Nota"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Alias"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Acciones del grupo"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Statistics"
msgstr "Estadísticas"
-#, fuzzy
msgctxt "LABEL"
msgid "Created"
msgstr "Creado"
msgid "Notice deleted."
msgstr "Mensaje borrado"
+msgid "Notice"
+msgstr "Mensajes"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
"informarnos al %s."
#. TRANS: Message given saving SMS phone number confirmation code without having provided one.
-#, fuzzy
msgid "No code entered."
-msgstr "No ingresó código"
+msgstr "No ingresó el código"
#. TRANS: Menu item for site administration
msgid "Snapshots"
msgstr "Estas son las personas que escuchan los avisos de %s."
#. TRANS: Subscriber list text when the logged in user has no subscribers.
-#, fuzzy
msgid ""
"You have no subscribers. Try subscribing to people you know and they might "
"return the favor."
msgstr ""
"No tienes suscriptores. Intenta suscribirte a gente que conozcas y puede que "
-"te devuelvan el favor"
+"te devuelvan el favor."
#. TRANS: Subscriber list text when looking at the subscribers for a of a user other
#. TRANS: than the logged in user that has no subscribers. %s is the user nickname.
msgid "Tag %s"
msgstr "%s etiqueta"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Perfil de usuario"
msgid "Tag user"
msgstr "Etiquetar usuario"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Etiquetas para este usuario (letras, números, -, ., y _), separadas por "
"comas o espacios"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Etiqueta inválida: \"% s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"haz clic en \"Cancelar\"."
#. TRANS: Button text on Authorise Subscription page.
-#, fuzzy
msgctxt "BUTTON"
msgid "Accept"
msgstr "Aceptar"
#. TRANS: Title for button on Authorise Subscription page.
-#, fuzzy
msgid "Subscribe to this user."
-msgstr "Suscribirse a este usuario"
+msgstr "Suscribirse a este usuario."
#. TRANS: Button text on Authorise Subscription page.
-#, fuzzy
msgctxt "BUTTON"
msgid "Reject"
msgstr "Rechazar"
#. TRANS: Title for button on Authorise Subscription page.
-#, fuzzy
msgid "Reject this subscription."
-msgstr "Rechazar esta suscripción"
+msgstr "Rechazar esta suscripción."
#. TRANS: Client error displayed for an empty authorisation request.
msgid "No authorization request!"
"Debes haber recibido una copia de la Licencia Pública General de Affero GNU "
"con este programa. Si no la recibiste, visita %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Complementos"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Nombre"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Acciones de usuario"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Eliminación de usuario en curso..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Editar configuración del perfil"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Editar"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Enviar un mensaje directo a este usuario"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Mensaje"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderar"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Rol de usuario"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrador"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderador"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
#. TRANS: Localized tooltip for '...' expansion button on overlong remote messages.
msgctxt "TOOLTIP"
msgid "Show more"
-msgstr ""
+msgstr "Ver más"
#. TRANS: Inline reply form submit button: submits a reply comment.
-#, fuzzy
msgctxt "BUTTON"
msgid "Reply"
msgstr "Responder"
msgid "Write a reply..."
msgstr ""
-#, fuzzy
msgid "Status"
-msgstr "StatusNet"
+msgstr "Estado"
#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set.
#. TRANS: Text between [] is a link description, text between () is the link itself.
msgid "No content for notice %s."
msgstr "Buscar en el contenido de mensajes"
-#, fuzzy, php-format
+#, php-format
msgid "No such user %s."
-msgstr "No existe ese usuario."
+msgstr "Este usuario no existe %s"
#. TRANS: Client exception thrown when post to collection fails with a 400 status.
#. TRANS: %1$s is a URL, %2$s is the status, %s$s is the fail reason.
#. TRANS: %1$s is a URL, %2$s is the status, %s$s is the fail reason.
#. TRANS: Exception thrown when post to collection fails with a status that is not handled.
#. TRANS: %1$s is a URL, %2$s is the status, %s$s is the fail reason.
-#, fuzzy, php-format
+#, php-format
msgctxt "URLSTATUSREASON"
msgid "%1$s %2$s %3$s"
-msgstr "%1$s - %2$s"
+msgstr "%1$s %2$s %3$s"
#. TRANS: Client exception thrown when there is no source attribute.
msgid "Can't handle remote content yet."
msgid "Unable to delete design setting."
msgstr "No se puede eliminar la configuración de diseño."
+msgid "Home"
+msgstr "Página de inicio"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Configuración básica del sitio"
msgstr ""
#. TRANS: Menu item title/tooltip
-#, fuzzy
msgid "Plugins configuration"
-msgstr "Configuración de rutas"
+msgstr "Configuración de plugins"
#. TRANS: Client error 401.
msgid "API resource requires read-write access, but you only have read access."
msgstr "No ha sido posible autenticarte."
#. TRANS: Server error displayed when trying to create an anynymous OAuth consumer.
-#, fuzzy
msgid "Could not create anonymous consumer."
-msgstr "No fue posible crear alias."
+msgstr "No fue posible crear usuario anónimo."
#. TRANS: Server error displayed when trying to create an anynymous OAuth application.
#, fuzzy
msgstr "Cancelar"
msgid " by "
-msgstr ""
+msgstr "por "
#. TRANS: Application access type
msgid "read-write"
msgstr "El cambio de contraseña ha fallado"
#. TRANS: Exception thrown when a password change attempt fails because it is not allowed.
-#, fuzzy
msgid "Password changing is not allowed."
-msgstr "No está permitido cambiar la contraseña"
+msgstr "El cambio de contraseña no está permitido"
#. TRANS: Title for the form to block a user.
msgid "Block"
msgstr[0] "Eres miembro de este grupo:"
msgstr[1] "Eres miembro de estos grupos:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"comandos:\n"
-"on - activar notificaciones\n"
-"off - desactivar notificaciones\n"
-"help - mostrar esta ayuda\n"
-"follow <usuario> - suscribirse al usuario\n"
-"groups - listar los grupos que sigues\n"
-"subscriptions - listar las personas que sigues\n"
-"subscribers - listar los grupos que te siguen\n"
-"leave <usuario> - cancelar la suscripción al usuario\n"
-"d <usuario> <text> - dirigir mensaje al usuario\n"
-"get <usuario> - obtener último aviso del usuario\n"
-"whois <usuario> - obtener información del perfil del usuario\n"
-"lose <usuario> - obligar al usuario a que deje de seguirte\n"
-"fav <usuario> - añadir el último aviso del usario a tus favoritos\n"
-"fav #<id_aviso> - añadir el aviso con el ID dado a tus favoritos\n"
-"repeat #<id_aviso> - repetir el aviso con el ID dado\n"
-"repeat <usuario> - repetir el último aviso del usuario\n"
-"reply #<id_aviso> - responder al aviso del ID dado\n"
-"reply <usuario> - responder al último aviso del usuario\n"
-"join <grupo> - unirse a un grupo\n"
-"login - obtener un vínculo para iniciar sesión en la interfaz Web\n"
-"drop <grupo> - abandonar el grupo\n"
-"stats - obtener tus estadísticas\n"
-"stop - igual que 'desactivar'\n"
-"quit - igual que 'desactivar'\n"
-"sub <usuario> - igual que 'seguir'\n"
-"unsub <usuario> - igual que 'abandonar'\n"
-"last <usuario> - igual que 'obtener'\n"
-"on <usuario> - aún sin implementar.\n"
-"off <usuario> - aún sin implementar.\n"
-"nudge <usuario> - recordarle a un ausuario que actualice.\n"
-"invite <phone number> - aún sin implementar.\n"
-"track <word> - aún sin implementar.\n"
-"untrack <word> - aún sin implementar.\n"
-"track off - aún sin implementar.\n"
-"untrack all - aún sin implementar.\n"
-"tracks - aún sin implementar.\n"
-"tracking - aún sin implementar.\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Resultados de comando"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "No se puede activar notificación."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "No se puede desactivar notificación."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Suscribirse a este usuario"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Desuscribirse de este usuario"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Mensajes directos a %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Información del perfil"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Repetir este mensaje."
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Responder a este mensaje."
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Desconocido"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Borrar grupo"
+
+#. TRANS: Help message for IM/SMS command "stats"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr "Actualiza tu estado."
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Todavía no se implementa comando."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
#, fuzzy
msgid "Database error"
msgstr "Error de la base de datos"
-msgid "Home"
-msgstr "Página de inicio"
-
msgid "Public"
msgstr "Público"
"permitido es 2 MB."
#. TRANS: Radio button on profile design page that will enable use of the uploaded profile image.
-#, fuzzy
msgctxt "RADIO"
msgid "On"
msgstr "Activar"
#. TRANS: Radio button on profile design page that will disable use of the uploaded profile image.
-#, fuzzy
msgctxt "RADIO"
msgid "Off"
msgstr "Desactivar"
#. TRANS: Header for feed links (h2).
msgid "Feeds"
-msgstr ""
+msgstr "Feeds"
msgid "All"
msgstr "Todo"
"Ubicación del grupo, si existe, por ejemplo \"Ciudad, Estado (o Región), País"
"\""
+msgid "Aliases"
+msgstr "Alias"
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Añadir o modificar el diseño %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Acciones del grupo"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Grupos con mayor cantidad de miembros"
#. TRANS: Body for address confirmation email.
#. TRANS: %1$s is the addressed user's nickname, %2$s is the StatusNet sitename,
#. TRANS: %3$s is the URL to confirm at.
-#, fuzzy, php-format
+#, php-format
msgid ""
"Hey, %1$s.\n"
"\n"
"Thanks for your time, \n"
"%2$s\n"
msgstr ""
-"¡Hola, %s!\n"
+"Hola, %1$s !\n"
"\n"
-"Hace un momento, alguien introdujo esta dirección de correo electrónico en %"
-"s.\n"
+"Hace un momento, alguien introdujo esta dirección de correo electrónico en %2"
+"$s.\n"
"\n"
-"Si has sido tú y deseas confirmarlo, haz clic en el vínculo de abajo:\n"
+"Si fuiste tú y deseas confirmarlo, haz clic en el vínculo de abajo:\n"
"\n"
-"%s\n"
+"%3$s\n"
"\n"
"Si no, simplemente ignora este mensaje.\n"
"\n"
"Gracias por tu tiempo, \n"
-"%s\n"
+"%2$s\n"
#. TRANS: Subject of new-subscriber notification e-mail.
#. TRANS: %1$s is the subscribing user's nickname, %2$s is the StatusNet sitename.
#. TRANS: %3$s is the subscriber's profile URL, %4$s is the subscriber's location (or empty)
#. TRANS: %5$s is the subscriber's homepage URL (or empty), %6%s is the subscriber's bio (or empty)
#. TRANS: %7$s is a link to the addressed user's e-mail settings.
-#, fuzzy, php-format
+#, php-format
msgid ""
"%1$s is now listening to your notices on %2$s.\n"
"\n"
"%7$s.\n"
"\n"
"----\n"
-"Cambia tus preferencias de notificaciones a tu correo electrónico en %8$s\n"
+"Cambia tu correo electrónico o las opciones de notificación en %7$s\n"
#. TRANS: Profile info line in new-subscriber notification e-mail.
#. TRANS: %s is biographical information.
#. TRANS: Subject for 'nudge' notification email.
#. TRANS: %s is the nudging user.
-#, fuzzy, php-format
+#, php-format
msgid "You have been nudged by %s"
msgstr "%s te ha dado un toque"
#. TRANS: Subject for favorite notification e-mail.
#. TRANS: %1$s is the adding user's long name, %2$s is the adding user's nickname.
-#, fuzzy, php-format
+#, php-format
msgid "%1$s (@%2$s) added your notice as a favorite"
-msgstr "%s (@%s) agregó tu mensaje a los favoritos"
+msgstr "%1$s (@%2$s) agregó tu mensaje como favorito."
#. TRANS: Body for favorite notification e-mail.
#. TRANS: %1$s is the adding user's long name, $2$s is the date the notice was created,
#. TRANS: E-mail subject for notice notification.
#. TRANS: %1$s is the sending user's long name, %2$s is the adding user's nickname.
-#, fuzzy, php-format
+#, php-format
msgid "%1$s (@%2$s) sent a notice to your attention"
-msgstr "%s (@%s) ha enviado un aviso a tu atención"
+msgstr "%1$s (@%2$s) ha enviado un aviso para tu atención"
#. TRANS: Body of @-reply notification e-mail.
#. TRANS: %1$s is the sending user's long name, $2$s is the StatusNet sitename,
msgstr "Seleccione un operador móvil"
#. TRANS Entry in drop-down selection box in direct-message inbox/outbox when no one is available to message.
-#, fuzzy
msgid "No mutual subscribers."
-msgstr "¡No estás suscrito!"
+msgstr "Sin suscripción mutua"
msgid "To"
msgstr "Para"
msgid "Send"
msgstr "Enviar"
-#, fuzzy
msgid "Messages"
-msgstr "Mensaje"
+msgstr "Mensajes"
msgid "from"
msgstr "desde"
msgstr "Adjuntar"
#. TRANS: Title for input field to attach a file to a notice.
-#, fuzzy
msgid "Attach a file."
-msgstr "Adjuntar un archivo"
+msgstr "Adjuntar archivo"
#. TRANS: Field label to add location to a notice.
msgid "Share my location"
msgid "Notice repeated"
msgstr "Mensaje repetido"
+msgid "Update your status..."
+msgstr "Actualiza tu estado."
+
msgid "Nudge this user"
msgstr "Dar un toque a este usuario"
#. TRANS: Plugin admin panel controls
msgctxt "plugin"
msgid "Disable"
-msgstr ""
+msgstr "Deshabilitado"
#. TRANS: Plugin admin panel controls
msgctxt "plugin"
msgid "Enable"
-msgstr ""
+msgstr "Habilitado"
msgctxt "plugin-description"
msgid "(Plugin descriptions unavailable when disabled.)"
msgid "Search"
msgstr "Buscar"
-#, fuzzy
msgid "Search the site"
-msgstr "Buscar sitio"
+msgstr "Buscar en el sitio"
#. TRANS: H2 text for user subscription statistics.
#. TRANS: Label for user statistics.
msgstr "Principales posteadores"
#. TRANS: Title for the form to unblock a user.
-#, fuzzy
msgctxt "TITLE"
msgid "Unblock"
msgstr "Desbloquear"
msgid "User %1$s (%2$d) has no profile record."
msgstr "El usuario no tiene un perfil."
-msgid "Edit Avatar"
-msgstr "Editar imagen"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Acciones de usuario"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Eliminación de usuario en curso..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Editar configuración del perfil"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Editar"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Enviar un mensaje directo a este usuario"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Mensaje"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderar"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Rol de usuario"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrador"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderador"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "No conectado."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "línea temporal de %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Encontrar gente en este sitio"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Etiqueta inválida: \"% s\""
# Author: ArianHT
# Author: Brion
# Author: Choxos
+# Author: Ebraminio
# Author: Everplays
# Author: Mjbmr
# Author: Narcissus
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:10+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:56+0000\n"
"Last-Translator: Ahmad Sufi Mahmudi\n"
"Language-Team: Persian <http://translatewiki.net/wiki/Portal:fa>\n"
"MIME-Version: 1.0\n"
"X-Language-Code: fa\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgstr "نمیتوان طرحتان بههنگامسازی کرد."
#. TRANS: Title for Atom feed.
-#, fuzzy
msgctxt "ATOM"
msgid "Main"
msgstr "اصلی"
#. TRANS: Title for Atom feed with a user's favorite notices. %s is a user nickname.
#. TRANS: Title for Atom favorites feed.
#. TRANS: %s is a user nickname.
-#, fuzzy, php-format
+#, php-format
msgid "%s favorites"
-msgstr "برگزیدهها"
+msgstr "%s مورد علاقهٔ شما"
#. TRANS: Title for Atom feed with a user's memberships. %s is a user nickname.
-#, fuzzy, php-format
+#, php-format
msgid "%s memberships"
-msgstr "اعضای گروه %s"
+msgstr "%s عضو"
#. TRANS: Client error displayed when users try to block themselves.
msgid "You cannot block yourself!"
msgid "%s's groups"
msgstr "گروههای %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, fuzzy, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "هست عضو %s گروه"
msgstr "پیدا کردن محتوای پیامها"
#. TRANS: Client exception thrown when trying favorite a notice without content.
-#, fuzzy
-msgid "Unknown note."
-msgstr "ناشناخته"
+msgid "Unknown notice."
+msgstr "اعلان ناشناخته."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#, fuzzy
msgstr "پیدا کردن محتوای پیامها"
#. TRANS: Client exception thrown when trying to subscribe to a non-existing group.
-#, fuzzy
msgid "Unknown group."
-msgstr "ناشناخته"
+msgstr "گروه ناشناخته."
#. TRANS: Client exception thrown when trying to subscribe to an already subscribed group.
#, fuzzy
#. TRANS: Button on avatar upload page to upload an avatar.
#. TRANS: Submit button to confirm upload of a user backup file for account restore.
-#, fuzzy
msgctxt "BUTTON"
msgid "Upload"
-msgstr "پایینگذاری"
+msgstr "بارگذاری"
#. TRANS: Button on avatar upload crop form to confirm a selected crop as avatar.
-#, fuzzy
msgctxt "BUTTON"
msgid "Crop"
msgstr "برش"
msgstr ""
#. TRANS: Submit button to backup an account on the backup account page.
-#, fuzzy
msgctxt "BUTTON"
msgid "Backup"
-msgstr "پیشزمینه"
+msgstr "پشتیبانگیری"
#. TRANS: Title for submit button to backup an account on the backup account page.
msgid "Backup your account."
#. TRANS: Confirmation text for user deletion. The user has to type this exactly the same, including punctuation.
msgid "I am sure."
-msgstr ""
+msgstr "من مطمئن هستم."
#. TRANS: Notification for user about the text that must be input to be able to delete a user account.
#. TRANS: %s is the text that needs to be input.
msgstr ""
#. TRANS: Confirmation that a user account has been deleted.
-#, fuzzy
msgid "Account deleted."
-msgstr "چهره پاک شد."
+msgstr "حساب کاربری حذف شد."
#. TRANS: Page title for page on which a user account can be deleted.
#. TRANS: Option in profile settings to delete the account of the currently logged in user.
-#, fuzzy
msgid "Delete account"
-msgstr "ساختÙ\86 Û\8cÚ© جسابâ\80\8cکاربری"
+msgstr "ØØ°Ù\81 Øساب کاربری"
#. TRANS: Form text for user deletion form.
msgid ""
#. TRANS: Input title for the delete account field.
#. TRANS: %s is the text that needs to be input.
-#, fuzzy, php-format
+#, php-format
msgid "Enter \"%s\" to confirm that you want to delete your account."
-msgstr "شما نمیتوانید کاربران را پاک کنید."
+msgstr "«%s» را برای تأیید اینکه میخواهید حسابتان حذف شود وارد کنید."
#. TRANS: Button title for user account deletion.
#, fuzzy
#. TRANS: Title of delete group page.
#. TRANS: Form legend for deleting a group.
-#, fuzzy
msgid "Delete group"
-msgstr "ØØ°Ù\81 کاربر"
+msgstr "ØØ°Ù\81 گرÙ\88Ù\87"
#. TRANS: Warning in form for deleleting a group.
#, fuzzy
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "نمیتوان برنامه را ساخت."
+#, fuzzy
+msgid "Invalid image."
+msgstr "اندازه نادرست است."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "گروه جدید"
"این صندوق خروجی شماست، که پیامهای خصوصی فرستاده شده به وسیلهٔ شما را فهرست "
"میکند."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "تغییر گذرواژه"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "تغییر گذرواژهٔ شما"
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "تغییر گذرواژه"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "گذرواژهٔ پیشین"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "گذرواژهٔ تازه"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "۶ نویسه یا بیشتر"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "تایید"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "مانند گذرواژهٔ بالا"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "تغییر"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "گذرواژه باید ۶ نویسه یا بیشتر باشد."
msgid "Passwords don't match."
msgstr "گذرواژهها مطابقت ندارند."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "گذرواژه پیشین اشتباه است"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "هنگام ذخیرهٔ کاربر خطا رخ داد؛ نامعتبر است."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "نمیتوان گذرواژهٔ جدید را ذخیره کرد."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "گذرواژه ذخیره شد."
msgid "Server"
msgstr "کارگزار"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "نام میزبان کارگزار وبگاه."
msgid "Path"
msgstr "مسیر"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "مسیر وبگاه"
msgid "Locale directory"
msgstr "شاخهٔ پوسته"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Directory path to locales."
msgstr "مسیر پوشه برای زبانهای محلی"
msgid "Fancy URLs"
msgstr "نشانیهای تمیز"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "از نشانیهای تمیز (خواناتر و ماندگارتر در ذهن) استفاده شود؟"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "پوسته"
msgstr "مسیر پوشه برای زبانهای محلی"
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "جستوجوی کاربران"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "یک برچسب کاربری معتبر نیست: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "کاربران خود برچسبگذاری شده با %1$s - صفحهٔ %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "این عمل تنها درخواستهای POST را میپذیرد."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "شما نمیتوانید کاربران را پاک کنید."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "چنین صفحهای وجود ندارد."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "افزونهها"
msgid "Default plugins"
msgstr "زبان پیشفرض"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "محتوای پیام نامعتبر است."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "مجوز پیام «%1$s» با مجوز وبگاه «%2$s» سازگار نیست."
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "نشان نادرست »%s«"
msgid "Restore account"
msgstr "ساختن یک جسابکاربری"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr ""
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "نمیتوان جریان عمومی را دریافت کرد."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "خطزمانی عمومی، صفحهٔ %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "خطزمانی عمومی"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "خوراک جریان عمومی (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "خوراک جریان عمومی (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "خوراک جریان عمومی (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
msgstr ""
"این خطزمانی عمومی برای %%site.name%% است، اما هیچکس هنوز چیزی نفرستاده است."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "اولین کسی باشید که پیام میفرستد!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr "چرا [ثبت نام](%%action.register%%) نمیکنید و اولین پیام را نمیفرستید؟"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"action.register%%) تا آگاهیهایی را دربارهٔ خودتان با دوستان، خانواده و "
"همکارانتان به اشتراک بگذارید! ([بیشتر بخوانید](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "گروه %1$s، صفحهٔ %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "یادداشت"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "نام های مستعار"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "اعمال گروه"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "پیام پاک شد."
+#, fuzzy
+msgid "Notice"
+msgstr "پیامها"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "برچسب %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "نمایهٔ کاربر"
msgid "Tag user"
msgstr "برچسبگذاری کاربر"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"برچسبها برای این کاربر (حروف، اعداد، -، .، و _)، جدا شده با کاما- یا فاصله-"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "نشان نادرست »%s«"
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"شما باید یک رونوشت از مجوز GNU Affero General Public License را همراه این "
"برنامه دریافت کرده باشید. اگر چنین نیست، %s را ببینید."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "افزونهها"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "نام"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "اعمال کاربر"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "پاککردن کاربر در حالت اجرا است..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "ویرایش تنظیمات نمایه"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "ویرایش"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "پیام مستقیم به این کاربر بفرستید"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "پیام"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "اداره کردن"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "وظیفهٔ کاربر"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "رئیس"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "مدیر"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "نمی توان تنظیمات طراحی شده را پاک کرد ."
+msgid "Home"
+msgstr "خانه"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "پیکربندی اولیه وبگاه"
msgid_plural "You are a member of these groups:"
msgstr[0] "شما یک عضو این گروه هستید:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"دستورات:\n"
-"on - روشنکردن آگاهسازیها\n"
-"off - خاموشکردن آگاهسازیها\n"
-"help - نشان دادن این کمک\n"
-"follow <nickname> - مشترک کاربر شدن\n"
-"groups - گروههایی را که به آنها پیوستهاید، فهرست میکند\n"
-"subscriptions - افرادی را که دنبال میکنید، فهرست میکند\n"
-"subscribers - کاربرانی را که شما را دنبال میکنند، فهرست میکند\n"
-"leave <nickname> - لغو اشتراک از کاربر\n"
-"d <nickname> <text> - پیام مستقیم به کاربر\n"
-"get <nickname> - دریافت آخرین پیام از کاربر\n"
-"whois <nickname> - دریافت اطلاعات نمایهٔ کاربر\n"
-"lose <nickname> - وادار کردن کاربر به توقف دنبالکردن شما\n"
-"fav <nickname> - افزودن آخرین پیام کاربر به عنوان برگزیده\n"
-"fav #<notice_id> - افزودن پیام با یک شناسهٔ دادهشده به عنوان برگزیده\n"
-"repeat #<notice_id> - تکرار کردن یک پیام با یک شناسهٔ دادهشده\n"
-"repeat <nickname> - تکرار کردن آخرین پیام از کاربر\n"
-"reply #<notice_id> - پاسخدادن به یک پیام با یک شناسهٔ دادهشده\n"
-"reply <nickname> - پاسخدادن به آخرین پیام از کاربر\n"
-"join <group> - پیوستن به گروه\n"
-"login - دریافت یک پیوند برای واردشدن به رابط وب\n"
-"drop <group> - ترککردن گروه\n"
-"stats - دریافت آمار شما\n"
-"stop - مانند «off»\n"
-"quit - مانند «off»\n"
-"sub <nickname> - مانند «follow»\n"
-"unsub <nickname> - مانند «leave»\n"
-"last <nickname> - مانند «get»\n"
-"on <nickname> - هنوز پیاده نشده است.\n"
-"off <nickname> - هنوز پیاده نشده است.\n"
-"nudge <nickname> - یادآوریکردن به یک کاربر برای بهروز کردن\n"
-"invite <phone number> - هنوز پیاده نشده است.\n"
-"track <word> - هنوز پیاده نشده است.\n"
-"untrack <word> - هنوز پیاده نشده است.\n"
-"track off - هنوز پیاده نشده است.\n"
-"untrack all - هنوز پیاده نشده است.\n"
-"tracks - هنوز پیاده نشده است.\n"
-"tracking - هنوز پیاده نشده است.\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "نتیجه دستور"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "ناتوان در روشن کردن آگاه سازی."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "ناتوان در خاموش کردن آگاه سازی."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "مشترک شدن این کاربر"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "لغو مشترکشدن از این کاربر"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "پیامهای مستقیم به %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "اطلاعات نمایه"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "تکرار این پیام"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "به این پیام پاسخ دهید"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "گروه ناشناخته."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "حذف گروه"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "دستور هنوز پیاده نشده است."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
#, fuzzy
msgid "Database error"
msgstr "خطای پایگاه داده"
-msgid "Home"
-msgstr "خانه"
-
msgid "Public"
msgstr "عمومی"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "مکان گروه، در صورت وجود داشتن، مانند «شهر، ایالت (یا استان)، کشور»"
+msgid "Aliases"
+msgstr "نام های مستعار"
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "اعمال گروه"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "گروه های با اعضاء بیشتر"
msgid "Notice repeated"
msgstr "پیام تکرار شد"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "یادآوریکردن به این کاربر"
msgid "User %1$s (%2$d) has no profile record."
msgstr "کاربر هیچ نمایهای ندارد."
-msgid "Edit Avatar"
-msgstr "ویرایش اواتور"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "اعمال کاربر"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "پاککردن کاربر در حالت اجرا است..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "ویرایش تنظیمات نمایه"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "ویرایش"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "پیام مستقیم به این کاربر بفرستید"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "پیام"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "اداره کردن"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "وظیفهٔ کاربر"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "رئیس"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "مدیر"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "شما به سیستم وارد نشده اید."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "خطزمانی %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "پیدا کردن افراد در این وبگاه"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "نشان نادرست »%s«"
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:11+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:57+0000\n"
"Language-Team: Finnish <http://translatewiki.net/wiki/Portal:fi>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: fi\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
#. TRANS: Client error displayed trying to direct message self (403).
msgid ""
"Do not send a message to yourself; just say it to yourself quietly instead."
-msgstr "Älä lähetä viestiä itsellesi, vaan kuiskaa se vain hiljaa itsellesi."
+msgstr "Et voi lähettää viestiä itsellesi. Kuiskaa se hiljaa itsellesi."
#. TRANS: Client error displayed when requesting a status with a non-existing ID.
#. TRANS: Client error displayed when trying to remove a favourite with an invalid ID.
msgid "%s's groups"
msgstr "Käyttäjän %s ryhmät"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
-msgstr "%1$s ryhmät, joiden jäsen %2$s on."
+msgstr "Sivuston %1$s ryhmät, joiden jäsen %2$s on."
#. TRANS: Message is used as a title when listing the lastest 20 groups. %s is a site name.
#. TRANS: Message is used as a page title. %s is a nick name.
msgstr "Vain päivityksiä voi merkitä suosikeiksi."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+#, fuzzy
+msgid "Unknown notice."
msgstr "Tuntematon päivitys."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Submit button to confirm upload of a user backup file for account restore.
msgctxt "BUTTON"
msgid "Upload"
-msgstr "Lataa"
+msgstr "Tallenna"
#. TRANS: Button on avatar upload crop form to confirm a selected crop as avatar.
msgctxt "BUTTON"
#. TRANS: %s is the text that needs to be input.
#, php-format
msgid "Enter \"%s\" to confirm that you want to delete your account."
-msgstr "Anna \"%s\" varmistaaksesi että haluat todella poistaa käyttäjätilisi."
+msgstr "Kirjoita ”%s”, jos haluat todella poistaa käyttäjätilisi."
#. TRANS: Button title for user account deletion.
msgid "Permanently delete your account"
-msgstr "Poista käyttäjätilisi lopullisesti"
+msgstr "Poista käyttäjätilini lopullisesti"
#. TRANS: Client error displayed trying to delete an application while not logged in.
msgid "You must be logged in to delete an application."
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
#. TRANS: %s is the non-existing document.
#, php-format
msgid "No such document \"%s\"."
-msgstr "Dokumenttia \"%s\" ei ole."
+msgstr "Dokumenttia ”%s” ei ole."
#. TRANS: Title for "Edit application" form.
#. TRANS: Form legend.
#. TRANS: Instructions for "Edit application" form.
msgid "Use this form to edit your application."
-msgstr "Käytä tätä lomaketta muokataksesi sovellustasi."
+msgstr "Käytä tätä lomaketta sovelluksesi muokkaamiseen."
#. TRANS: Validation error shown when not providing a name in the "Edit application" form.
#. TRANS: Validation error shown when not providing a name in the "New application" form.
"will be removed from the group, unable to post, and unable to subscribe to "
"the group in the future."
msgstr ""
-"Haluatko varmasti estää käyttäjän \"%1$s\" ryhmästä \"%2$s\"? Heidät "
-"poistetaan ryhmästä, eivät voi lähettää päivityksiä, ja eivät voi enää "
-"liittyä ryhmään."
+"Haluatko varmasti estää käyttäjän %1$s ryhmästä %2$s? Estetty käyttäjä "
+"poistetaan ryhmästä, hän ei voi lähettää päivityksiä, eikä liittyä ryhmään."
#. TRANS: Submit button title for 'No' when blocking a user from a group.
msgid "Do not block this user from this group."
#, php-format
msgid ""
"You can upload a logo image for your group. The maximum file size is %s."
-msgstr "Voit ladata ryhmälle logokuvan. Maksimikoko on %s."
+msgstr "Voit ladata ryhmälle logokuvan. Kuvan enimmäiskoko on %s."
#. TRANS: Submit button for uploading a group logo.
msgid "Upload"
msgid "Could not create application."
msgstr "Ei voitu lisätä aliasta."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Koko ei kelpaa."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Uusi ryhmä"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "Tämä on postilaatikkosi, jossa on lähettämäsi yksityisviestit."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Vaihda salasana"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Vaihda salasanasi."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Salasanan vaihto"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Vanha salasana"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Uusi salasana"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 tai useampia merkkejä"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Vahvista"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Sama kuin ylläoleva salasana"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Vaihda"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Salasanassa pitää olla 6 tai useampia merkkejä."
msgid "Passwords don't match."
msgstr "Salasanat eivät täsmää."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Väärä vanha salasana"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Virhe tapahtui käyttäjän tallentamisessa; epäkelpo."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Uutta salasanaa ei voida tallentaa."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Salasana tallennettu."
msgid "Server"
msgstr "Palauta"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr ""
msgid "Path"
msgstr "Polut"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "Palvelun ilmoitus"
msgid "Locale directory"
msgstr "Taustakuvan hakemisto"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr ""
msgid "Fancy URLs"
msgstr ""
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
+#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "Theme"
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SMS"
msgid "People search"
msgstr "Etsi ihmisiä"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Tuo ei ole kelvollinen sähköpostiosoite."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, fuzzy, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Käyttäjät joilla henkilötagi %s - sivu %d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Sinä et voi poistaa käyttäjiä."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Sivua ei ole."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+msgctxt "TITLE"
msgid "Plugins"
msgstr ""
msgid "Default plugins"
msgstr "Ensisijainen kieli"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Koko ei kelpaa."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Virheellinen tagi: \"%s\""
msgid "Restore account"
msgstr "Luo uusi ryhmä"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr ""
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Julkista päivitysvirtaa ei saatu."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Julkinen aikajana, sivu %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Julkinen aikajana"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Julkinen syöte (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Julkisen Aikajanan Syöte (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Julkinen syöte (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, fuzzy, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Tämä on käyttäjän %s ja kavereiden aikajana, mutta kukaan ei ole lähettyänyt "
"vielä mitään."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Ole ensimmäinen joka lähettää päivityksen!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"friends, family, and colleagues! ([Read more](%%doc.help%%))"
msgstr ""
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, fuzzy, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Ryhmät, sivu %d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Huomaa"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Aliakset"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Ryhmän toiminnot"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Päivitys on poistettu."
+msgid "Notice"
+msgstr "Päivitykset"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Tagi %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Käyttäjän profiili"
msgid "Tag user"
msgstr "Tagaa käyttäjä"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Käyttäjän tagit (kirjaimet, numerot, -, ., ja _), pilkulla tai välilyönnillä "
"erotettuna"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Virheellinen tagi: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr ""
+
#. TRANS: Form input field label for application name.
#, fuzzy
msgid "Name"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Käyttäjän toiminnot"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+#, fuzzy
+msgid "Edit profile settings"
+msgstr "Profiiliasetukset"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Lähetä suora viesti tälle käyttäjälle"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Viesti"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr ""
+
+#. TRANS: Label text on user profile to select a user role.
+#, fuzzy
+msgid "User role"
+msgstr "Käyttäjän profiili"
+
+#. TRANS: Role that can be set for a user profile.
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "Ylläpitäjät"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, fuzzy, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Twitter-asetuksia ei voitu tallentaa!"
+msgid "Home"
+msgstr "Kotisivu"
+
#. TRANS: Menu item title/tooltip
#, fuzzy
msgid "Basic site configuration"
msgstr[0] "Sinä et kuulu tähän ryhmään."
msgstr[1] "Sinä et kuulu tähän ryhmään."
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Komennon tulos"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Ilmoituksia ei voi pistää päälle."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Ilmoituksia ei voi pistää pois päältä."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Tilaa tämä käyttäjä"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Peruuta tämän käyttäjän tilaus"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Suorat viestit käyttäjälle %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Profiilitieto"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Vastaa tähän päivitykseen"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Vastaa tähän päivitykseen"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Tuntematon ryhmä."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Poista ryhmä"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Komentoa ei ole vielä toteutettu."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "Tietokantavirhe"
-msgid "Home"
-msgstr "Kotisivu"
-
msgid "Public"
msgstr "Julkinen"
"Ryhmän paikka, jos sellainen on, kuten \"Kaupunki, Maakunta (tai Lääni), Maa"
"\""
+msgid "Aliases"
+msgstr "Aliakset"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Ryhmän toiminnot"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Ryhmät, joissa eniten jäseniä"
msgid "Notice repeated"
msgstr "Päivitys on poistettu."
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Tönäise tätä käyttäjää"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Käyttäjällä ei ole profiilia."
-#, fuzzy
-msgid "Edit Avatar"
-msgstr "Kuva"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Käyttäjän toiminnot"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-#, fuzzy
-msgid "Edit profile settings"
-msgstr "Profiiliasetukset"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Lähetä suora viesti tälle käyttäjälle"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Viesti"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr ""
-
-#. TRANS: Label text on user profile to select a user role.
-#, fuzzy
-msgid "User role"
-msgstr "Käyttäjän profiili"
-
-#. TRANS: Role that can be set for a user profile.
-#, fuzzy
-msgctxt "role"
-msgid "Administrator"
-msgstr "Ylläpitäjät"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr ""
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Et ole kirjautunut sisään."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s aikajana"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Hae ihmisiä tältä sivustolta"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Virheellinen tagi: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:12+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:37:58+0000\n"
"Language-Team: French <http://translatewiki.net/wiki/Portal:fr>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: fr\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Groupes de %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Groupes de %1$s dont %2$s est membre."
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Inconnu"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Impossible de créer l’application."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Taille incorrecte."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Nouveau groupe"
msgstr ""
"Cette boîte d’envoi regroupe les messages personnels que vous avez envoyés."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Changer de mot de passe"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Modifier votre mot de passe."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Modification du mot de passe"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Ancien mot de passe"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nouveau mot de passe"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 caractères ou plus"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Confirmer"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Identique au mot de passe ci-dessus"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Modifier"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Votre mot de passe doit contenir au moins 6 caractères."
msgid "Passwords don't match."
msgstr "Les mots de passe ne correspondent pas."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Ancien mot de passe incorrect"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Erreur lors de l’enregistrement de l’utilisateur ; invalide."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Impossible de sauvegarder le nouveau mot de passe."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Mot de passe enregistré."
msgid "Server"
msgstr "Serveur"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Nom d’hôte du serveur du site."
msgid "Path"
msgstr "Chemin"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Chemin du site."
msgid "Locale directory"
msgstr "Dossier des données de localisation"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Chemin du dossier vers les paramètres régionaux."
msgid "Fancy URLs"
msgstr "Jolies URL"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Utiliser des jolies URL (plus lisibles et faciles à mémoriser) ?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Thème"
msgstr "Le répertoire où les pièces jointes sont stockées."
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Recherche de personnes"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Cette marque est invalide : %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Utilisateurs marqués par eux-mêmes avec %1$s - page %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Cette action n'accepte que les requêtes de type POST."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Vous ne pouvez pas supprimer des utilisateurs."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Page non trouvée."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Extensions"
msgid "Default plugins"
msgstr "Langue par défaut"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Contenu de l’avis invalide."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"La licence des avis « %1$s » n’est pas compatible avec la licence du site « %2"
"$s »."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Marque invalide : « %s »"
msgid "Restore account"
msgstr "Créer un compte"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Au-delà de la limite de page (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Impossible de récupérer le flux public."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Flux public - page %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Flux public"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Fil du flux public (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Fil du flux public (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Fil du flux public (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Ceci est la chronologie publique de %%site.name%% mais personne n’a encore "
"rien posté."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Soyez le premier à poster !"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Pourquoi ne pas [créer un compte](%%action.register%%) et être le premier à "
"poster !"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"vous avec vos amis, famille et collègues ! ([Plus d’informations](%%doc.help%"
"%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Groupe %1$s, page %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Note"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Alias"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Actions du groupe"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Avis supprimé."
+msgid "Notice"
+msgstr "Avis"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Marque %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Profil de l’utilisateur"
msgid "Tag user"
msgstr "Marquer l’utilisateur"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Marques pour cet utilisateur (lettres, chiffres, -, ., et _), séparées par "
"des virgules ou des espaces"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Marque invalide : « %s »"
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Vous avez dû recevoir une copie de la Licence Publique Générale GNU Affero "
"avec ce programme. Si ce n’est pas le cas, consultez %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Extensions"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Nom"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Actions de l’utilisateur"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Suppression de l'utilisateur en cours..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Modifier les paramètres du profil"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Modifier"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Envoyer un message à cet utilisateur"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Message"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Modérer"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Rôle de l'utilisateur"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrateur"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Modérateur"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Impossible de supprimer les paramètres de conception."
+msgid "Home"
+msgstr "Site personnel"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Configuration basique du site"
msgstr[0] "Vous êtes membre de ce groupe :"
msgstr[1] "Vous êtes membre de ces groupes :"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Commandes :\n"
-"on - activer les notifications\n"
-"off - désactiver les notifications\n"
-"help - montrer cette aide\n"
-"follow <nickname> - s’abonner à l’utilisateur\n"
-"groups - lister les groupes que vous avez rejoints\n"
-"subscriptions - lister les personnes que vous suivez\n"
-"subscribers - lister les personnes qui vous suivent\n"
-"leave <nickname> - se désabonner de l’utilisateur\n"
-"d <nickname> <text> - message direct à l’utilisateur\n"
-"get <nickname> - obtenir le dernier avis de l’utilisateur\n"
-"whois <nickname> - obtenir le profil de l’utilisateur\n"
-"lose <nickname> - forcer un utilisateur à arrêter de vous suivre\n"
-"fav <nickname> - ajouter de dernier avis de l’utilisateur comme favori\n"
-"fav #<notice_id> - ajouter l’avis correspondant à l’identifiant comme "
-"favori\n"
-"repeat #<notice_id> - reprendre l’avis correspondant à l’identifiant\n"
-"repeat <nickname> - reprendre le dernier avis de l’utilisateur\n"
-"reply #<notice_id> - répondre à l’avis correspondant à l’identifiant\n"
-"reply <nickname> - répondre au dernier avis de l’utilisateur\n"
-"join <group> - rejoindre le groupe\n"
-"login - Obtenir un lien pour s’identifier sur l’interface web\n"
-"drop <group> - quitter le groupe\n"
-"stats - obtenir vos statistiques\n"
-"stop - même effet que 'off'\n"
-"quit - même effet que 'off'\n"
-"sub <nickname> - même effet que 'follow'\n"
-"unsub <nickname> - même effet que 'leave'\n"
-"last <nickname> - même effet que 'get'\n"
-"on <nickname> - pas encore implémenté.\n"
-"off <nickname> - pas encore implémenté.\n"
-"nudge <nickname> - envoyer un clin d’œil à l’utilisateur.\n"
-"invite <phone number> - pas encore implémenté.\n"
-"track <word> - pas encore implémenté.\n"
-"untrack <word> - pas encore implémenté.\n"
-"track off - pas encore implémenté.\n"
-"untrack all - pas encore implémenté.\n"
-"tracks - pas encore implémenté.\n"
-"tracking - pas encore implémenté.\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Résultats de la commande"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Impossible d’activer les avertissements."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Impossible de désactiver les avertissements."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "S’abonner à cet utilisateur"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Ne plus suivre cet utilisateur"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Messages directs envoyés à %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Information de profil"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Reprendre cet avis"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Répondre à cet avis"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Inconnu"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Supprimer le groupe"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Cette commande n’a pas encore été implémentée."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "No configuration file found."
msgid "Database error"
msgstr "Erreur de la base de données"
-msgid "Home"
-msgstr "Site personnel"
-
msgid "Public"
msgstr "Public"
"Emplacement du groupe, s’il y a lieu, de la forme « Ville, État (ou région), "
"pays »"
+msgid "Aliases"
+msgstr "Alias"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Ajouter ou modifier l’apparence du groupe « %s »"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Actions du groupe"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Groupes avec le plus de membres"
msgid "Notice repeated"
msgstr "Avis repris"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Envoyer un clin d’œil à cet utilisateur"
msgid "User %1$s (%2$d) has no profile record."
msgstr "L’utilisateur %1$s (%2$d) n’a pas de profil."
-msgid "Edit Avatar"
-msgstr "Modifier l’avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Actions de l’utilisateur"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Suppression de l'utilisateur en cours..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Modifier les paramètres du profil"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Modifier"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Envoyer un message à cet utilisateur"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Message"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Modérer"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Rôle de l'utilisateur"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrateur"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Modérateur"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Non connecté."
msgid "Getting backup from file '%s'."
msgstr "Obtention de la sauvegarde depuis le fichier « %s »."
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "Activité de %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Chercher des personnes sur ce site"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Marque invalide : « %s »"
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:13+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:00+0000\n"
"Language-Team: Friulian <http://translatewiki.net/wiki/Portal:fur>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: fur\n"
"X-Message-Group: #out-statusnet-core\n"
msgid "%s's groups"
msgstr "Grups di %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr ""
msgstr ""
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
-msgstr ""
+#, fuzzy
+msgid "Unknown notice."
+msgstr "Gnûf avîs"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
msgid "Already a favorite."
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr ""
+#, fuzzy
+msgid "Invalid image."
+msgstr "La dimension no je valide."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Gnûf grup"
"Cheste e je la tô pueste in jessude, dulà che tu cjatis i messaçs privâts "
"che tu âs mandât."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Cambie la password"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Cambie la tô password"
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Cambiament di password"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Vecje password"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Gnove password"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "6 o plui caratars."
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Conferme"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "Compagn che la password parsore"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Cambie"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "La password e à di sei di sîs o plui caratars."
msgid "Passwords don't match."
msgstr "Lis passwords no corispuindin."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "La vecje password e je sbaliade"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr ""
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
msgid "Cannot save new password."
msgstr ""
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Password salvade"
msgid "Server"
msgstr "Servidôr"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr ""
msgid "Path"
msgstr ""
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr ""
msgid "Locale directory"
msgstr ""
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr ""
msgid "Fancy URLs"
msgstr ""
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Teme"
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Cîr personis"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr ""
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr ""
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
msgid "You cannot administer plugins."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "La pagjine no esist."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+msgctxt "TITLE"
msgid "Plugins"
msgstr ""
msgid "Default plugins"
msgstr "Lenghe predeterminade"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr ""
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Invalid tag: \"%s\"."
msgstr ""
msgid "Restore account"
msgstr ""
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr ""
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr ""
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Ativitât publiche, pagjine %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Ativitât publiche"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Canâl de ativitât publiche (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Canâl de ativitât publiche (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Canâl de ativitât publiche (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"net/). [Unissiti cumò](%%action.register%%) par condividi chel che tu fasis "
"cun amîs, famee e companie! ([Altris informazions](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Grup %1$s, pagjine %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Note"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr ""
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Azions dal grup"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "L'avîs al è stât eliminât."
+#, fuzzy
+msgid "Notice"
+msgstr "Avîs"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Etichete %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Profîl dal utent"
msgstr "Etichete utent"
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "La etichete no je valide: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Tu varessis di vê ricevût une copie de GNU Affero General Public License "
"insieme cun chest program. Se nol è cussì, cjale %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr ""
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Non"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Azions dal utent"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Cambie lis impuestazions dal profîl"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Cambie"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Mande un messaç diret a chest utent"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Messaç"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr ""
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Rûl dal utent"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Aministradôr"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderatôr"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr ""
+#, fuzzy
+msgid "Home"
+msgstr "Pagjine web"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr ""
msgstr[0] "Tu sês un membri di chest grup:"
msgstr[1] "Tu sês un membri di chescj grups:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on"
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "off"
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Sotscrivimi a chest utent"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "No tu sês plui sotscrit a %s."
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Messaçs direts par %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Informazions sul profîl"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Ripet chest avîs"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Rispuint a chest avîs"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Grup %s"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Elimine il grup"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "Erôr de base di dâts"
-#, fuzzy
-msgid "Home"
-msgstr "Pagjine web"
-
msgid "Public"
msgstr "Public"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "Lûc dal grup, se al esist, come \"Citât, Regjon, Stât\"."
+msgid "Aliases"
+msgstr ""
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Azions dal grup"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Grups cun plui membris"
msgid "Notice repeated"
msgstr "Avîs ripetût"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr ""
msgid "User %1$s (%2$d) has no profile record."
msgstr ""
-msgid "Edit Avatar"
-msgstr "Modifiche l'avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Azions dal utent"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Cambie lis impuestazions dal profîl"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Cambie"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Mande un messaç diret a chest utent"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Messaç"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr ""
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Rûl dal utent"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Aministradôr"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderatôr"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "No tu sês jentrât."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "Ativitât di %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Cjate int in chest sît"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "La etichete no je valide: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:14+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:01+0000\n"
"Language-Team: Galician <http://translatewiki.net/wiki/Portal:gl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: gl\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Os grupos de %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Grupos de %1$s aos que pertence %2$s."
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Descoñecida"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Non se puido crear a aplicación."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Tamaño non válido."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Novo grupo"
msgstr ""
"Esta é a súa caixa de saída. Nela lístanse as mensaxes privadas que enviou."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Cambiar o contrasinal"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Cambiar o seu contrasinal."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Cambio de contrasinal"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Contrasinal anterior"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Novo contrasinal"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "Seis ou máis caracteres"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Confirmar"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Igual ao contrasinal anterior"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Cambiar"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "O contrasinal debe conter seis ou máis caracteres."
msgid "Passwords don't match."
msgstr "Os contrasinais non coinciden."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "O contrasinal anterior non é correcto"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Houbo un erro ao gardar o usuario. Incorrecto."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Non se puido gardar o novo contrasinal."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Gardouse o contrasinal."
msgid "Server"
msgstr "Servidor"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Nome do servidor do sitio."
msgid "Path"
msgstr "Ruta"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Ruta do sitio."
msgid "Locale directory"
msgstr "Directorio das traducións"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Ruta do directorio das traducións."
msgid "Fancy URLs"
msgstr "Enderezos URL elegantes"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Quere utilizar os enderezos URL elegantes (mellores de ler e lembrar)?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Tema visual"
msgstr "Ruta do directorio das traducións"
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Busca de xente"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "A etiqueta de persoa non é correcta: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Usuarios etiquetados por si mesmos con %1$s - páxina %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Esta acción só permite solicitudes POST."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Non pode borrar usuarios."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Esa páxina non existe."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Complementos"
msgid "Default plugins"
msgstr "Lingua por defecto"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "O contido da nota é incorrecto."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"A licenza \"%1$s\" da nota non é compatible coa licenza \"%2$s\" do sitio."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Etiqueta incorrecta: \"%s\""
msgid "Restore account"
msgstr "Crear unha conta"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Alén do límite da páxina (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Non se puido obter o fluxo público."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Liña do tempo pública, páxina %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Liña do tempo pública"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Fonte de novas no fluxo público (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Fonte de novas no fluxo público (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Fonte de novas no fluxo público (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Esta é a liña do tempo pública para %%site.name%% pero ninguén publicou nada "
"aínda."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Sexa o primeiro en publicar!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Por que non [rexistrar unha conta](%%action.register%%) e ser o primeiro en "
"publicar?"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"register%%) para compartir notas persoais cos amigos, a familia e os "
"compañeiros! ([Máis información](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Grupo %1$s, páxina %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Nota"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Pseudónimos"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Accións do grupo"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Borrouse a nota."
+#, fuzzy
+msgid "Notice"
+msgstr "Notas"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Etiqueta %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Perfil do usuario"
msgid "Tag user"
msgstr "Etiquetar ao usuario"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Etiquetas para este usuario (letras, números, -, ., e _), separadas por "
"comas ou espazos en branco"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Etiqueta incorrecta: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Debeu recibir unha copia da Licenza Pública Xeral Affero de GNU xunto co "
"programa. En caso contrario, vexa %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Complementos"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Nome"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Accións do usuario"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Procedendo a borrar o usuario..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Modificar a configuración do perfil"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Modificar"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Enviarlle unha mensaxe directa a este usuario"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Mensaxe"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderar"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Rol do usuario"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrador"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderador"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Non se puido borrar a configuración do deseño."
+#, fuzzy
+msgid "Home"
+msgstr "Páxina persoal"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Configuración básica do sitio"
msgstr[0] "Vostede pertence a este grupo:"
msgstr[1] "Vostede pertence a estes grupos:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Ordes:\n"
-"on - activa as notificacións\n"
-"off - desactiva as notificacións\n"
-"help - amosa esta axuda\n"
-"follow <alcume> - subscribirse ao usuario\n"
-"groups - lista os grupos nos que está\n"
-"subscriptions - lista a xente á que segue\n"
-"subscribers - lista a xente que o segue\n"
-"leave <alcume> - cancela a subscrición ao usuario\n"
-"d <alcume> <texto> - mensaxe directa a un usuario\n"
-"get <alcume> - obter a última nota do usuario\n"
-"whois <alcume> - obtén a información do perfil do usuario\n"
-"lose <alcume> - facer que o usuario deixe de seguilo\n"
-"fav <alcume> - marcar como \"favorita\" a última nota do usuario\n"
-"fav #<id da nota> - marcar como \"favorita\" a nota coa id indicada\n"
-"repeat #<id da nota> - repetir a nota doa id indicada\n"
-"repeat <alcume> - repetir a última nota do usuario\n"
-"reply #<id da nota> - responder a unha nota coa id indicada\n"
-"reply <alcume> - responder á última nota do usuario\n"
-"join <grupo> - unirse ao grupo indicado\n"
-"login - obter un enderezo para identificarse na interface web\n"
-"drop <grupo> - deixar o grupo indicado\n"
-"stats - obter as súas estatísticas\n"
-"stop - idéntico a \"off\"\n"
-"quit - idéntico a \"off\"\n"
-"sub <alcume> - idéntico a \"follow\"\n"
-"unsub <alcume> - idéntico a \"leave\"\n"
-"last <alcume> - idéntico a \"get\"\n"
-"on <alcume> - aínda non se integrou\n"
-"off <alcume> - aínda non se integrou\n"
-"nudge <alcume> - facerlle un aceno ao usuario indicado\n"
-"invite <número de teléfono> - aínda non se integrou\n"
-"track <palabra> - aínda non se integrou\n"
-"untrack <palabra> - aínda non se integrou\n"
-"track off - aínda non se integrou\n"
-"untrack all - aínda non se integrou\n"
-"tracks - aínda non se integrou\n"
-"tracking - aínda non se integrou\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Resultados da orde"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Non se pode activar a notificación."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Non se pode desactivar a notificación."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Subscribirse a este usuario"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Cancelar a subscrición a este usuario"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Mensaxes directas a %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Información do perfil"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Repetir esta nota"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Responder a esta nota"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Descoñecida"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Borrar un grupo"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Aínda non se integrou esa orde."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
#, fuzzy
msgid "Database error"
msgstr "Houbo un erro na base de datos"
-#, fuzzy
-msgid "Home"
-msgstr "Páxina persoal"
-
msgid "Public"
msgstr "Públicas"
"Localidade do grupo, se a ten, como por exemplo \"Cidade, Provincia, "
"Comunidade, País\""
+msgid "Aliases"
+msgstr "Pseudónimos"
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Engadir ou modificar o deseño de %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Accións do grupo"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Grupos con máis membros"
msgid "Notice repeated"
msgstr "Repetiuse a nota"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Facerlle un aceno a este usuario"
msgid "User %1$s (%2$d) has no profile record."
msgstr "O usuario %1$s (%2$d) non ten perfil."
-msgid "Edit Avatar"
-msgstr "Modificar o avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Accións do usuario"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Procedendo a borrar o usuario..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Modificar a configuración do perfil"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Modificar"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Enviarlle unha mensaxe directa a este usuario"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Mensaxe"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderar"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Rol do usuario"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrador"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderador"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Non iniciou sesión."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "Liña do tempo de %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Atopar xente neste sitio"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Etiqueta incorrecta: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:15+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:02+0000\n"
"Language-Team: Upper Sorbian <http://translatewiki.net/wiki/Portal:hsb>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: hsb\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : (n%100==3 || "
"n%100==4) ? 2 : 3)\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Skupiny wužiwarja %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Skupiny na %1$s, w kotrychž wužiwar %2$s je čłon."
msgstr "Jenož zdźělenki dadźa so jako fawority składować."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Njeznata notica."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Aplikacija njeda so wutworić."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Njepłaćiwa wulkosć."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Nowa skupina"
"To je twój wuchadny póst, kotryž twoje priwatne powěsće nalistuje, kotrež sy "
"pósłał."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Hesło změnić"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Změń swoje hesło."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Hesło změnjene"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Stare hesło"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nowe hesło"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "6 abo wjace znamješkow."
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Wobkrućić"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "Samsne hesło kaž horjeka."
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Změnić"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Hesło dyrbi 6 abo wjace znamješkow měć."
msgid "Passwords don't match."
msgstr "Hesle so njekryjetej."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Wopačne stare hesło"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Zmylk při składowanju wužiwarja; njepłaćiwy."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
msgid "Cannot save new password."
msgstr "Nowe hesło njeda so składować."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Hesło składowane."
msgid "Server"
msgstr "Serwer"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Serwerowe mjeno sydła"
msgid "Path"
msgstr "Šćežka"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Sydłowa šćežka."
msgid "Locale directory"
msgstr "Zapis lokalow"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Zapisowa šćežka k lokalam."
msgid "Fancy URLs"
msgstr "Šikwane URL"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Šat"
msgstr "Zapis, hdźež přiwěški su."
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Za ludźimi pytać"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Njepłaćiwa wosobowa taflička: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr ""
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Njemóžeš wužiwarjow wušmórnyć."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Strona njeeksistuje."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Tykače"
msgid "Default plugins"
msgstr "Standardna rěč"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Njepłaćiwy wobsah zdźělenki."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Njepłaćiwa taflička: \"%s\"."
msgid "Restore account"
msgstr "Konto wobnowić"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Limit stronow (%s) překročeny."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Zjawny prud njeda so wotwołać."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Zjawna časowa lajsta, strona %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr ""
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Kanal zjawneho pruda (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Kanal zjawneho pruda (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Kanal zjawneho pruda (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Budź prěni, kiž něšto pisa!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"friends, family, and colleagues! ([Read more](%%doc.help%%))"
msgstr ""
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "%1$s skupina, strona %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Přispomnjenka"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Aliasy"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Skupinske akcije"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Zdźělenka zničena."
+#, fuzzy
+msgid "Notice"
+msgstr "Zdźělenki"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr ""
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Wužiwarski profil"
msgstr ""
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Njepłaćiwa taflička: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Tykače"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Mjeno"
msgid "No AtomPub API service for %s."
msgstr "Žana słužba AtomPub API za %s."
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Wužiwarske akcije"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Wužiwar so haša..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Profilowe nastajenja wobdźěłać"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Wobdźěłać"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Tutomu wužiwarja direktnu powěsć pósłać"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Powěsć"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderěrować"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Wužiwarska róla"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrator"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Njeje móžno, designowe nastajenje zhašeć."
+#, fuzzy
+msgid "Home"
+msgstr "Startowa strona"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Zakładna sydłowa konfiguracija"
msgstr[2] "Sy čłon tutych skupinow:"
msgstr[3] "Sy čłon tutych skupinow:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Přikazowe wuslědki"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Zdźělenje njeda so zmóžnić."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Zdźělenje njeda so znjemóžnić."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Tutoho wužiwarja abonować"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Tutoho wužiwarja wotskazać"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Direktne powěsće do %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Zdaleny profil skupina njeje!"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Tutu zdźělenku wospjetować"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Na tutu zdźělenku wotmołwić"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Njeznata skupina"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Skupinu zhašeć"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Přikaz hišće njeimplementowany."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "Zmylk w datowej bance"
-#, fuzzy
-msgid "Home"
-msgstr "Startowa strona"
-
msgid "Public"
msgstr "Zjawny"
"Městno za skupinu, jeli eksistuje, na př. \"město, zwjazkowy kraj (abo "
"region), kraj\"."
+msgid "Aliases"
+msgstr "Aliasy"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Design skupiny %s přidać abo wobdźěłać"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Skupinske akcije"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Skupiny z najwjace čłonami"
msgid "Notice repeated"
msgstr "Zdźělenka wospjetowana"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Tutoho wužiwarja storčić"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Wužiwar %1$s (%2$d) nima profilowu datowu sadźbu."
-msgid "Edit Avatar"
-msgstr "Awatar wobdźěłać"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Wužiwarske akcije"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Wužiwar so haša..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Profilowe nastajenja wobdźěłać"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Wobdźěłać"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Tutomu wužiwarja direktnu powěsć pósłać"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Powěsć"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderěrować"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Wužiwarska róla"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrator"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderator"
-
msgid "Not allowed to log in."
msgstr "Přizjewjenje njedowolene."
msgid "Getting backup from file '%s'."
msgstr "Wobstaruje so zawěsćenje z dataje \"%s\"-"
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Ludźi na tutym sydle pytać"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Njepłaćiwa taflička: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:16+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:03+0000\n"
"Language-Team: Hungarian <http://translatewiki.net/wiki/Portal:hu>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: hu\n"
"X-Message-Group: #out-statusnet-core\n"
msgid "%s's groups"
msgstr "%s csoportjai"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr ""
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Ismeretlen művelet"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Nem sikerült létrehozni az alkalmazást."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Érvénytelen méret."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Új csoport"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "Ez az elküldött privát üzeneteid postafiókja."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Jelszó megváltoztatása"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Változtasd meg a jelszavadat."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Jelszó megváltoztatása"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Régi jelszó"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Új jelszó"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 vagy több karakter"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Megerősítés"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Ugyanaz mint a fenti jelszó"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Változtassunk"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "A jelszónak legalább 6 karakterből kell állnia."
msgid "Passwords don't match."
msgstr "A jelszavak nem egyeznek."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Érvénytelen a régi jelszó"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Hiba a felhasználó mentésekor; érvénytelen."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Az új jelszót nem sikerült elmenteni."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Jelszó elmentve."
msgid "Server"
msgstr "Szerver"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "A webhely kiszolgálójának neve."
msgid "Path"
msgstr "Útvonal"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "Webhely útvonala"
msgid "Locale directory"
msgstr "Avatar-könyvtár"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Directory path to locales."
msgstr "A nyelvi fájlok elérési útvonala"
msgid "Fancy URLs"
msgstr ""
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Téma"
msgstr "A nyelvi fájlok elérési útvonala"
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Emberkereső"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr ""
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr ""
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Nem törölhetsz felhasználókat."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Nincs ilyen lap."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+msgctxt "TITLE"
msgid "Plugins"
msgstr ""
msgid "Default plugins"
msgstr "Alapértelmezett nyelv"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Érvénytelen megjegyzéstartalom."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "A hír licence ‘%1$s’ nem kompatibilis a webhely licencével ‘%2$s’."
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Érvénytelen címke: \"%s\""
msgid "Restore account"
msgstr ""
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr ""
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr ""
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Közösségi történet, %d. oldal"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Közösségi történet"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr ""
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr ""
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr ""
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr "Ez itt %%site.name%% közösségi története, de még senki nem írt semmit."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Légy az első aki ír!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr "Ha [regisztrálnál](%%action.register%%), te írhatnád az első hírt!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"[Csatlakozz](%%action.register%%), és küldj híreket magadról a barátaidnak, "
"a családodnak, a munkatársaidnak! ([Tudj meg többet](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "%1$s csoport, %2$d. oldal"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Megjegyzés"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Álnevek"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Csoport-tevékenységek"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "A hírt töröltük."
+#, fuzzy
+msgid "Notice"
+msgstr "Hírek"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr ""
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Felhasználói profil"
msgid "Tag user"
msgstr ""
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
-
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Érvénytelen címke: \"%s\""
+"Címkék magadhoz (betűk, számok, -, ., és _), vesszővel vagy szóközzel "
+"elválasztva"
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr ""
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Név"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Felhasználói műveletek"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr ""
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Szerkesztés"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr ""
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Üzenet"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderálás"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Felhasználói szerepkör"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Adminisztrátor"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderátor"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Nem sikerült törölni a megjelenés beállításait."
+msgid "Home"
+msgstr "Otthon"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "A webhely elemi beállításai"
msgstr[0] "Ennek a csoportnak vagy tagja:"
msgstr[1] "Ezeknek a csoportoknak vagy tagja:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on"
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "off"
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Ezen felhasználók híreire már feliratkoztál:"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Ezen felhasználók híreire már feliratkoztál:"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Közvetlen üzenetek neki: %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Személyes profil"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Ismételjük meg ezt a hírt"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Válaszoljunk erre a hírre"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Ismeretlen művelet"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Felhasználó törlése"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "Adatbázishiba"
-msgid "Home"
-msgstr "Otthon"
-
msgid "Public"
msgstr ""
"A csoport földrajzi elhelyezkedése, ha van ilyen, pl. \"Város, Megye, Ország"
"\""
+msgid "Aliases"
+msgstr "Álnevek"
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Csoport-tevékenységek"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "A legtöbb tagból álló csoportok"
msgid "Notice repeated"
msgstr "A hírt megismételtük"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Bökjük meg ezt a felhasználót"
msgid "User %1$s (%2$d) has no profile record."
msgstr "A felhasználónak nincs profilja."
-msgid "Edit Avatar"
-msgstr ""
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Felhasználói műveletek"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr ""
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Szerkesztés"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr ""
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Üzenet"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderálás"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Felhasználói szerepkör"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Adminisztrátor"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderátor"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Nem vagy bejelentkezve."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s története"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Emberek keresése az oldalon"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Érvénytelen címke: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:17+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:04+0000\n"
"Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ia\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Gruppos de %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Gruppos de %1$s del quales %2$s es membro."
msgstr "Solmente notas pote esser addite al favorites."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Nota incognite."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Non poteva crear application."
+msgid "Invalid image."
+msgstr "Imagine invalide."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Nove gruppo"
msgstr ""
"Isto es tu cassa de exito, que lista le messages private que tu ha inviate."
+#. TRANS: Title for page where to change password.
+msgctxt "TITLE"
msgid "Change password"
msgstr "Cambiar contrasigno"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Cambiar tu contrasigno."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Cambio del contrasigno"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Ancian contrasigno"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nove contrasigno"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "6 o plus characteres."
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Confirmar"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "Identic al contrasigno hic supra."
+#. TRANS: Button text on page where to change password.
+msgctxt "BUTTON"
msgid "Change"
msgstr "Cambiar"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Le contrasigno debe haber al minus 6 characteres."
msgid "Passwords don't match."
msgstr "Le contrasignos non corresponde."
-msgid "Incorrect old password"
-msgstr "Ancian contrasigno incorrecte"
+#. TRANS: Form validation error on page where to change password.
+msgid "Incorrect old password."
+msgstr "Ancian contrasigno incorrecte."
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Error de salveguardar le usator; invalide."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
msgid "Cannot save new password."
msgstr "Non pote salveguardar le nove contrasigno."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Contrasigno salveguardate."
msgid "Server"
msgstr "Servitor"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Nomine de host del servitor del sito."
msgid "Path"
msgstr "Cammino"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Cammino del sito."
msgid "Locale directory"
msgstr "Directorio de localisation"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Cammino al directorio de localisation."
msgid "Fancy URLs"
msgstr "URLs de luxo"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Usar URLs de luxo (plus legibile e memorabile)?"
+#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Thema"
msgstr "Cammino a ubi se trova le annexos."
#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Recerca de personas"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Etiquetta de personas invalide: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Usatores auto-etiquettate con %1$s - pagina %2$d"
msgid "Disabled"
msgstr "Disactivate"
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Iste action accepta solmente le requestas de typo POST."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
msgid "You cannot administer plugins."
msgstr "Tu non pote administrar plug-ins."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
msgid "No such plugin."
msgstr "Plug-in non existe."
msgstr "Activate"
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Plug-ins"
msgid "Default plugins"
msgstr "Plug-ins predefinite"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
"Tote le plug-ins predefinite ha essite disactivate in le file de "
"configuration del sito."
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Le contento del nota es invalide."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
-"Le licentia del nota ‘%1$s’ non es compatibile con le licentia del sito ‘%2"
-"$s’."
+"Le licentia del nota \"%1$s\" non es compatibile con le licentia del sito \"%"
+"2$s\"."
#. TRANS: Page title for profile settings.
msgid "Profile settings"
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Etiquetta invalide: \"%s\"."
msgid "Restore account"
msgstr "Restaurar conto"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Ultra le limite de pagina (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Non poteva recuperar le fluxo public."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Chronologia public, pagina %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Chronologia public"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Syndication del fluxo public (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Syndication del fluxo public (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Syndication del fluxo public (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Isto es le chronologia public pro %%site.name%%, ma nulle persona ha ancora "
"scribite alique."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Sia le prime a publicar!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Proque non [registrar un conto](%%action.register%%) e devenir le prime a "
"publicar?"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"[Inscribe te ora](%%action.register%%) pro condivider notas super te con "
"amicos, familia e collegas! ([Leger plus](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Gruppo %1$s, pagina %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Nota"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Aliases"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Actiones del gruppo"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Nota delite."
+#, fuzzy
+msgid "Notice"
+msgstr "Notas"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Etiquetta %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Profilo del usator"
msgid "Tag user"
msgstr "Etiquettar usator"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Etiquettas pro iste usator (litteras, numeros, -, . e _), separate per "
"commas o spatios"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Etiquetta invalide: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Un copia del GNU Affero General Public License deberea esser disponibile "
"insimul con iste programma. Si non, vide %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Plug-ins"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Nomine"
msgid "No AtomPub API service for %s."
msgstr "Il non ha un servicio API AtomPub pro %s."
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Actiones de usator"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Deletion del usator in curso…"
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Modificar configuration de profilo"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Modificar"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Inviar un message directe a iste usator"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Message"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderar"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Rolo de usator"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrator"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Write a reply..."
msgstr "Scriber un responsa..."
-#, fuzzy
msgid "Status"
-msgstr "StatusNet"
+msgstr "Stato"
#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set.
#. TRANS: Text between [] is a link description, text between () is the link itself.
msgid "Unable to delete design setting."
msgstr "Impossibile deler configuration de apparentia."
+msgid "Home"
+msgstr "Initio"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Configuration basic del sito"
msgstr[0] "Tu es membro de iste gruppo:"
msgstr[1] "Tu es membro de iste gruppos:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Commandos:\n"
-"on - activar notificationes\n"
-"off - disactivar notificationes\n"
-"help - monstrar iste adjuta\n"
-"follow <pseudonymo> - subscriber te al usator\n"
-"groups - listar le gruppos del quales tu es membro\n"
-"subscriptions - listar le personas que tu seque\n"
-"subscribers - listar le personas qui te seque\n"
-"leave <pseudonymo> - cancellar subscription al usator\n"
-"d <pseudonymo> <texto> - diriger un message al usator\n"
-"get <pseudonymo> - obtener le ultime nota del usator\n"
-"whois <pseudonymo> - obtener info de profilo del usator\n"
-"lose <pseudonymo> - fortiar le usator de cessar de sequer te\n"
-"fav <pseudonymo> - adder ultime nota del usator como favorite\n"
-"fav #<id_de_nota> - adder nota con le ID date como favorite\n"
-"repeat #<id_de_nota> - repeter le nota con le ID date\n"
-"repeat <pseudonymo> - repeter le ultime nota del usator\n"
-"reply #<id_de_nota> - responder al nota con le ID date\n"
-"reply <pseudonymo> - responder al ultime nota del usator\n"
-"join <gruppo> - facer te membro del gruppo\n"
-"login - obtener ligamine pro aperir session al interfacie web\n"
-"drop <gruppo> - quitar gruppo\n"
-"stats - obtener tu statisticas\n"
-"stop - como 'off'\n"
-"quit - como 'off'\n"
-"sub <pseudonymo> - como 'follow'\n"
-"unsub <pseudonymo> - como 'leave'\n"
-"last <pseudonymo> - como 'get'\n"
-"on <pseudonymo> - non ancora implementate.\n"
-"off <pseudonymo> - non ancora implementate.\n"
-"nudge <pseudonymo> - rememorar un usator de scriber alique.\n"
-"invite <numero de telephono> - non ancora implementate.\n"
-"track <parola> - non ancora implementate.\n"
-"untrack <parola> - non ancora implementate.\n"
-"track off - non ancora implementate.\n"
-"untrack all - non ancora implementate.\n"
-"tracks - non ancora implementate.\n"
-"tracking - non ancora implementate.\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Resultatos del commando"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Non pote activar notification."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Non pote disactivar notification."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Subscriber a iste usator"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Cancellar subscription a iste usator"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Messages directe a %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Le profilo remote non es un gruppo!"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Repeter iste nota"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Responder a iste nota"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Gruppo incognite."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Deler gruppo"
+
+#. TRANS: Help message for IM/SMS command "stats"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr "Actualisar tu stato..."
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Commando non ancora implementate."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "No configuration file found."
msgid "Database error"
msgstr "Error de base de datos"
-msgid "Home"
-msgstr "Initio"
-
msgid "Public"
msgstr "Public"
msgstr ""
"Loco del gruppo, si existe, como \"Citate, Provincia (o Region), Pais\"."
+msgid "Aliases"
+msgstr "Aliases"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Adder o modificar apparentia de %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Actiones del gruppo"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Gruppos con le plus membros"
msgstr "via"
msgid "Can't get author for activity."
-msgstr ""
+msgstr "Non pote determinar le autor pro le activitate."
-#, fuzzy
msgid "Bookmark not posted to this group."
-msgstr "Tu non ha le permission de deler iste gruppo."
+msgstr "Le marcapaginas non es publicate in iste gruppo."
-#, fuzzy
msgid "Object not posted to this user."
-msgstr "Non deler iste usator."
+msgstr "Le objecto non es inviate a iste usator."
msgid "Don't know how to handle this kind of target."
-msgstr ""
+msgstr "Non sape manear iste typo de destination."
#. TRANS: Validation error in form for registration, profile and group settings, etc.
msgid "Nickname cannot be empty."
msgid "Notice repeated"
msgstr "Nota repetite"
+msgid "Update your status..."
+msgstr "Actualisar tu stato..."
+
msgid "Nudge this user"
msgstr "Pulsar iste usator"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Le usator %1$s (%2$d) non ha un registro de profilo."
-msgid "Edit Avatar"
-msgstr "Modificar avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Actiones de usator"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Deletion del usator in curso…"
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Modificar configuration de profilo"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Modificar"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Inviar un message directe a iste usator"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Message"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderar"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Rolo de usator"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrator"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderator"
-
msgid "Not allowed to log in."
msgstr "Apertura de session non permittite."
msgid "Getting backup from file '%s'."
msgstr "Obtene copia de reserva ex file '%s'."
-#~ msgid "Friends timeline"
-#~ msgstr "Chronologia de amicos"
-
-#~ msgid "Everyone on this site"
-#~ msgstr "Omnes in iste sito"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Etiquetta invalide: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:18+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:05+0000\n"
"Language-Team: Italian <http://translatewiki.net/wiki/Portal:it>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: it\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Gruppi di %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Gruppi del sito %1$s a cui %2$s è iscritto."
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Sconosciuto"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Impossibile creare l'applicazione."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Dimensione non valida."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Nuovo gruppo"
"Questa è la casella della tua posta inviata, contiene i messaggi privati che "
"hai inviato."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Modifica password"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Modifica la tua password."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Modifica password"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Vecchia password"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nuova password"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 o più caratteri"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Conferma"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Stessa password di sopra"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Modifica"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "La password deve essere di 6 o più caratteri."
msgid "Passwords don't match."
msgstr "Le password non corrispondono."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Vecchia password non corretta"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Errore nel salvare l'utente; non valido."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Impossibile salvare la nuova password."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Password salvata."
msgid "Server"
msgstr "Server"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Nome host del server"
msgid "Path"
msgstr "Percorso"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "Percorso del sito"
msgid "Locale directory"
msgstr "Directory del tema"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Directory path to locales."
msgstr "Percorso della directory alle localizzazioni"
msgid "Fancy URLs"
msgstr "URL semplici"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Usare gli URL semplici (più leggibili e facili da ricordare)?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Tema"
msgstr "Percorso della directory alle localizzazioni"
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Cerca persone"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Non è un'etichetta valida di persona: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Utenti auto-etichettati con %1$s - pagina %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Quest'azione accetta solo richieste POST."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Non puoi eliminare utenti."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Pagina inesistente."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Plugin"
msgid "Default plugins"
msgstr "Lingua predefinita"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Contenuto del messaggio non valido."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"La licenza \"%1$s\" del messaggio non è compatibile con la licenza del sito "
"\"%2$s\"."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Etichetta non valida: \"%s\""
msgid "Restore account"
msgstr "Crea un account"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Oltre il limite della pagina (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Impossibile recuperare l'attività pubblica."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Attività pubblica, pagina %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Attività pubblica"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Feed dell'attività pubblica (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Feed dell'attività pubblica (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Feed dell'attività pubblica (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Questa è l'attività pubblica di %%site.name%%, ma nessuno ha ancora scritto "
"qualche cosa."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Fallo tu!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
"Perché non [crei un account](%%action.register%%) e scrivi qualche cosa!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"net/). [Registrati](%%action.register%%) per condividere messaggi con i tuoi "
"amici, i tuoi familiari e colleghi! ([Maggiori informazioni](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Gruppi di %1$s, pagina %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Nota"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Alias"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Azioni dei gruppi"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Messaggio eliminato."
+msgid "Notice"
+msgstr "Messaggi"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Etichetta %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Profilo utente"
msgid "Tag user"
msgstr "Etichette utente"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Etichette per questo utente (lettere, numeri, -, . e _), separate da virgole "
"o spazi"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Etichetta non valida: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Una copia della GNU Affero General Plublic License dovrebbe essere "
"disponibile assieme a questo programma. Se così non fosse, consultare %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Plugin"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Nome"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Azioni utente"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Eliminazione utente..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Modifica impostazioni del profilo"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Modifica"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Invia un messaggio diretto a questo utente"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Messaggio"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Modera"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Ruolo dell'utente"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Amministratore"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderatore"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Impossibile eliminare le impostazioni dell'aspetto."
+msgid "Home"
+msgstr "Pagina web"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Configurazione di base"
msgstr[0] "Non fai parte di questo gruppo:"
msgstr[1] "Non fai parte di questi gruppi:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Comandi:\n"
-"on - abilita le notifiche\n"
-"off - disabilita le notifiche\n"
-"help - mostra questo aiuto\n"
-"follow <soprannome> - ti abbona all'utente\n"
-"groups - elenca i gruppi di cui fai parte\n"
-"subscriptions - elenca le persone che segui\n"
-"subscribers - elenca le persone che ti seguono\n"
-"leave <soprannome> - annulla l'abbonamento dall'utente\n"
-"d <soprannome> <testo> - invia un messaggio diretto all'utente\n"
-"get <soprannome> - recupera l'ultimo messaggio dell'utente\n"
-"whois <soprannome> - recupera le informazioni del profilo dell'utente\n"
-"lose <soprannome> - forza un utente nel non seguirti più\n"
-"fav <soprannome> - aggiunge l'ultimo messaggio dell'utente tra i tuoi "
-"preferiti\n"
-"fav #<ID_messaggio> - aggiunge un messaggio con quell'ID tra i tuoi "
-"preferiti\n"
-"repeat #<ID_messaggio> - ripete un messaggio con quell'ID\n"
-"repeat <soprannome> - ripete l'ultimo messaggio dell'utente\n"
-"reply #<ID_messaggio> - risponde al messaggio con quell'ID\n"
-"reply <soprannome> - risponde all'ultimo messaggio dell'utente\n"
-"join <gruppo> - ti iscrive al gruppo\n"
-"login - recupera un collegamento all'interfaccia web per eseguire l'accesso\n"
-"drop <gruppo> - annulla la tua iscrizione al gruppo\n"
-"stats - recupera il tuo stato\n"
-"stop - stessa azione del comando \"off\"\n"
-"quit - stessa azione del comando \"on\"\n"
-"sub <soprannome> - stessa azione del comando \"follow\"\n"
-"unsub <soprannome> - stessa azione del comando \"leave\"\n"
-"last <soprannome> - stessa azione del comando \"get\"\n"
-"on <soprannome> -non ancora implementato\n"
-"off <soprannome> - non ancora implementato\n"
-"nudge <soprannome> - ricorda a un utente di scrivere qualche cosa\n"
-"invite <numero di telefono> - non ancora implementato\n"
-"track <parola> - non ancora implementato\n"
-"untrack <parola> - non ancora implementato\n"
-"track off - non ancora implementato\n"
-"untrack all - non ancora implementato\n"
-"tracks - non ancora implementato\n"
-"tracking - non ancora implementato\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Risultati comando"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Impossibile attivare le notifiche."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Impossibile disattivare le notifiche."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Abbonati a questo utente"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Annulla l'abbonamento da questo utente"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Messaggi diretti a %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Informazioni sul profilo"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Ripeti questo messaggio"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Rispondi a questo messaggio"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Sconosciuto"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Elimina utente"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Comando non ancora implementato."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
#, fuzzy
msgid "Database error"
msgstr "Errore del database"
-msgid "Home"
-msgstr "Pagina web"
-
msgid "Public"
msgstr "Pubblico"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "Dove è situato il gruppo, tipo \"città, regione, stato\""
+msgid "Aliases"
+msgstr "Alias"
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Aggiungi o modifica l'aspetto di %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Azioni dei gruppi"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "I gruppi più numerosi"
msgid "Notice repeated"
msgstr "Messaggio ripetuto"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Richiama questo utente"
msgid "User %1$s (%2$d) has no profile record."
msgstr "L'utente non ha un profilo."
-msgid "Edit Avatar"
-msgstr "Modifica immagine"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Azioni utente"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Eliminazione utente..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Modifica impostazioni del profilo"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Modifica"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Invia un messaggio diretto a questo utente"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Messaggio"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Modera"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Ruolo dell'utente"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Amministratore"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderatore"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Accesso non effettuato."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "Attività di %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Trova persone in questo sito"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Etichetta non valida: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:19+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:07+0000\n"
"Language-Team: Japanese <http://translatewiki.net/wiki/Portal:ja>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ja\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "%s のグループ"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, fuzzy, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "グループ %s はメンバー"
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "不明"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "アプリケーションを作成できません。"
+#, fuzzy
+msgid "Invalid image."
+msgstr "不正なサイズ。"
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "新しいグループ"
"これはあなたの送信箱です、あなたが送ったプライベート・メッセージをリストしま"
"す。"
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "パスワードの変更"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "パスワードを変更します。"
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "パスワード変更"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "古いパスワード"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "新しいパスワード"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6文字以上"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "パスワード確認"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "上と同じパスワード"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "変更"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "パスワードは6文字以上にする必要があります。"
msgid "Passwords don't match."
msgstr "パスワードが一致しません。"
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "古いパスワードが間違っています。"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "ユーザ保存エラー; 不正なユーザ"
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "新しいパスワードを保存できません。"
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "パスワードが保存されました。"
msgid "Server"
msgstr "サーバー"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "サイトのサーバーホスト名"
msgid "Path"
msgstr "パス"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "サイトパス"
msgid "Locale directory"
msgstr "テーマディレクトリ"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Directory path to locales."
msgstr "ロケールへのディレクトリパス"
msgid "Fancy URLs"
msgstr ""
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Fancy URL (読みやすく忘れにくい) を使用しますか?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "テーマ"
msgstr "ロケールへのディレクトリパス"
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "ピープルサーチ"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "有効なメールアドレスではありません。"
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "ユーザ自身がつけたタグ %1$s - ページ %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "ユーザを削除できません"
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "そのようなページはありません。"
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "プラグイン"
msgid "Default plugins"
msgstr "ご希望の言語"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "不正なトークン。"
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"つぶやきライセンス ‘%1$s’ はサイトライセンス ‘%2$s’ と互換性がありません。"
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "不正なタグ: \"%s\""
msgid "Restore account"
msgstr "新しいグループを作成"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, fuzzy, php-format
msgid "Beyond the page limit (%s)."
msgstr "ページ制限を超えました (%s)"
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "パブリックストリームを検索できません。"
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "パブリックタイムライン、ページ %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "パブリックタイムライン"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "パブリックストリームフィード (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "パブリックストリームフィード (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "パブリックストリームフィード (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"これは %%site.name%% のパブリックタイムラインです、しかしまだ誰も投稿していま"
"せん。"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "投稿する1番目になってください!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"なぜ [アカウント登録](%%action.register%%) しないのですか、そして最初の投稿を"
"してください!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"族そして同僚などについてのつぶやきを共有しましょう! ([もっと読む](%%doc.help%"
"%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "%1$s グループ、ページ %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "ノート"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "別名"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "グループアクション"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "つぶやきを削除しました。"
+msgid "Notice"
+msgstr "つぶやき"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "タグ %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "ユーザプロファイル"
msgid "Tag user"
msgstr "タグユーザ"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"このユーザのタグ (アルファベット、数字、-、.、_)、カンマかスペース区切り"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "不正なタグ: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "プラグイン"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "名前"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "利用者アクション"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "プロファイル設定編集"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "編集"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "この利用者にダイレクトメッセージを送る"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "メッセージ"
+
+#. TRANS: Label text on user profile to select a user role.
+#, fuzzy
+msgid "Moderate"
+msgstr "管理"
+
+#. TRANS: Label text on user profile to select a user role.
+#, fuzzy
+msgid "User role"
+msgstr "ユーザプロファイル"
+
+#. TRANS: Role that can be set for a user profile.
+#, fuzzy
+msgctxt "role"
+msgid "Administrator"
+msgstr "管理者"
+
+#. TRANS: Role that can be set for a user profile.
+#, fuzzy
+msgctxt "role"
+msgid "Moderator"
+msgstr "管理"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "デザイン設定を削除できません。"
+msgid "Home"
+msgstr "ホームページ"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "基本サイト設定"
msgid_plural "You are a member of these groups:"
msgstr[0] "あなたはこのグループのメンバーではありません:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "コマンド結果"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "通知をオンできません。"
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "通知をオフできません。"
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "このユーザーをフォロー"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "この利用者からのフォローを解除する"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "%s へのダイレクトメッセージ"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "プロファイル情報"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "このつぶやきを繰り返す"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "このつぶやきへ返信"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "不明"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "ユーザ削除"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "コマンドはまだ実装されていません。"
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "データベースエラー"
-msgid "Home"
-msgstr "ホームページ"
-
msgid "Public"
msgstr "パブリック"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "グループの場所, 例えば \"都市, 都道府県 (または 地域), 国\""
+msgid "Aliases"
+msgstr "別名"
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "グループアクション"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "メンバー数が多いグループ"
msgid "Notice repeated"
msgstr "つぶやきを繰り返しました"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "このユーザへ合図"
msgid "User %1$s (%2$d) has no profile record."
msgstr "ユーザはプロフィールをもっていません。"
-msgid "Edit Avatar"
-msgstr "アバターを編集する"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "利用者アクション"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "プロファイル設定編集"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "編集"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "この利用者にダイレクトメッセージを送る"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "メッセージ"
-
-#. TRANS: Label text on user profile to select a user role.
-#, fuzzy
-msgid "Moderate"
-msgstr "管理"
-
-#. TRANS: Label text on user profile to select a user role.
-#, fuzzy
-msgid "User role"
-msgstr "ユーザプロファイル"
-
-#. TRANS: Role that can be set for a user profile.
-#, fuzzy
-msgctxt "role"
-msgid "Administrator"
-msgstr "管理者"
-
-#. TRANS: Role that can be set for a user profile.
-#, fuzzy
-msgctxt "role"
-msgid "Moderator"
-msgstr "管理"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "ログインしていません。"
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s のタイムライン"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "このサイトの人々を探す"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "不正なタグ: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:20+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:08+0000\n"
"Language-Team: Georgian <http://translatewiki.net/wiki/Portal:ka>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ka\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "%s-ს ჯგუფები"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%1$s-ს ის ჯგუფები რომლებშიც გაერთიანებულია %2$s."
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "უცნობი"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "აპლიკაციის შექმნა ვერ მოხერხდა."
+#, fuzzy
+msgid "Invalid image."
+msgstr "ზომა არასწორია."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "ახალი ჯგუფი"
"ეს არის თქვენი გამავალი ფოსტა, რომელშიც ჩამოთვლილია პირადი შეტყობინებები "
"რომლებიც თქვენ გააგზავნეთ."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "შეცვალეთ პაროლი"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "შეცვალეთ თქვენი პაროლი."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "პაროლის შეცვლა"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "ძველი პაროლი"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "ახალი პაროლი"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 ან მეტი სიმბოლო"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "ვადასტურებ"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "იგივე რაც ზედა პაროლი"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "შეცვლა"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "პაროლი უნდა შედგებოდეს 6 ან მეტი სიმბოლოსგან."
msgid "Passwords don't match."
msgstr "პაროლები არ ემთხვევა."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "არასწორი ძველი პაროლი"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "შეცდომა მომხმარებლის შენახვისას; არასწორი."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "ვერ ვინახავ ახალ პაროლს."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "პაროლი შენახულია."
msgid "Server"
msgstr "სერვერი"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "საიტის სერვერის ჰოსტის სახელი."
msgid "Path"
msgstr "გზა"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "საიტის გზა"
msgid "Locale directory"
msgstr "იერსახის დირექტორია"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr ""
msgid "Fancy URLs"
msgstr "ლამაზი URL–ები"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "გამოვიყენო ლამაზი (მეტად კითხვადი და დასამახსოვრებელი) URL–ები?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "იერსახე"
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "პიროვნებების ძიება"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "პიროვნებების არასწორი სანიშნე: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr ""
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "ეს მოქმედება მხოლოდ POST მოთხოვნებს იღებს."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "თქვენ ვერ შეძლებთ მომხმარებლების წაშლას."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "ასეთი გვერდი არ არსებობს."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "დამატებები"
msgid "Default plugins"
msgstr "პირვანდელი ენა"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "შეტყობინების არასწორი შიგთავსი."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "შეტყობინების ლიცენზია ‘%1$s’ შეუთავსებელია საიტის ლიცენზიასთან ‘%2$s’."
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "არასწორი სანიშნე: \"%s\""
msgid "Restore account"
msgstr "გახსენი ანგარიში"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "გვერსიდ საზღვრის მიღმა (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "საჯარო ნაკადის გამოთხოვნა ვერ ხერხდება."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "საჯარო განახლებების ნაკადი, გვერდი %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "საჯარო განახლებების ნაკადი"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr ""
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr ""
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr ""
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
msgstr ""
"ეს არის საჯარო განახლებების ნაკადი, მაგრამ ჯერჯერობით არავის დაუპოსტავს."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "დაპოსტე პირველმა!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr "[დარეგისტრირდი](%%action.register%%) და დაპოსტე პირველმა!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"[შემოგვიერთდი ახლავე](%%action.register%%) და გაუზიარე შეტყობინებები "
"მეგობრებს, ოჯახის წევრებს და კოლეგებს! ([გაიგე მეტი](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr ""
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "შენიშვნა"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr ""
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr ""
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr ""
+#, fuzzy
+msgid "Notice"
+msgstr "შეტყობინებები"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "სანიშნე %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "მომხმარებლის პროფილი"
msgid "Tag user"
msgstr "მონიშნე მომხმარებელი"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"სანიშნეები ამ მომხმარებლისთვის (ასოები, ციფრები, -, ., და _). გამოყავით "
"მძიმით ან სივრცით"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "არასწორი სანიშნე: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"თქვენ უნდა მიგეღოთ GNU Affero ძირითადი საჯარო ლიცენზიის ასლი ამ პროგრამასთან "
"ერთად. თუ არა, იხილეთ %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "დამატებები"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "დასახელება"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "მომხმარებლის მოქმედებები"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "მომხმარებლის წაშლა პროგრესშია..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "პროფილის პარამეტრების რედაქტირება"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "რედაქტირება"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "გაუგზავნე პირდაპირი შეტყობინება ამ მომხმარებელს"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "შეტყობინება"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "მოდერაცია"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "მომხმარებლის როლი"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "ადმინისტრატორი"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "მოდერატორი"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "დიზაინის პარამეტრების წაშლა ვერ ხერხდება."
+#, fuzzy
+msgid "Home"
+msgstr "ვებ. გვერსი"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "საიტის ძირითადი კონფიგურაცია"
msgid_plural "You are a member of these groups:"
msgstr[0] ""
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "ბრძანების შედეგები"
+
+#. TRANS: Help message for IM/SMS command "on"
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "off"
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "გამოიწერე ეს მომხმარებელი"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "ამ მომხმარებლის გამოწერის გაუქმება"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "%s-სთვის გაგზავნილი პირდაპირი შეტყობინებები"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "ინფორმაცია პროფილზე"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "შეტყობინების გამეორება"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "უპასუხე ამ შეტყობინებას"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "უცნობი"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "მომხმარებლის წაშლა"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "ბრძანება ჯერ არ არის შემუშავებული."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "მონაცემთა ბაზის შეცდომა"
-#, fuzzy
-msgid "Home"
-msgstr "ვებ. გვერსი"
-
msgid "Public"
msgstr "საჯარო"
"ჯგუფის მდებარეობა არსებობის შემთხვევაში. მაგ.: \"ქალაქი, ქვეყანა (ან რეგიონი)"
"\""
+msgid "Aliases"
+msgstr ""
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr ""
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "ჯგუფები უმეტესი მომხმარებლებით"
msgid "Notice repeated"
msgstr "შეტყობინება გამეორებულია"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr ""
msgid "User %1$s (%2$d) has no profile record."
msgstr "მომხმარებელს პროფილი არ გააჩნია."
-msgid "Edit Avatar"
-msgstr "ავატარის რედაქტირება"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "მომხმარებლის მოქმედებები"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "მომხმარებლის წაშლა პროგრესშია..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "პროფილის პარამეტრების რედაქტირება"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "რედაქტირება"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "გაუგზავნე პირდაპირი შეტყობინება ამ მომხმარებელს"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "შეტყობინება"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "მოდერაცია"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "მომხმარებლის როლი"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "ადმინისტრატორი"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "მოდერატორი"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "ავტორიზებული არ ხართ."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s-ის ნაკადი"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "მოძებნე ადამიანები ამ საიტზე"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "არასწორი სანიშნე: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:21+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:09+0000\n"
"Language-Team: Korean <http://translatewiki.net/wiki/Portal:ko>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ko\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "%s의 그룹"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%1$s 사이트의 그룹에 %2$s 사용자가 멤버입니다."
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "알려지지 않은 행동"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "관심소식을 생성할 수 없습니다."
+#, fuzzy
+msgid "Invalid image."
+msgstr "옳지 않은 크기"
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "새로운 그룹"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "당신의 보낸 쪽지함입니다. 이곳엔 당신이 보냈던 비밀 쪽지가 있습니다."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "비밀번호 바꾸기"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "비밀번호를 변경하세요."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "비밀번호 변경"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "기존 비밀 번호"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "새로운 비밀 번호"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6글자 이상"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "인증"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "위와 같은 비밀 번호"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "변경"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "비밀번호는 6자리 이상이어야 합니다."
msgid "Passwords don't match."
msgstr "비밀 번호가 일치하지 않습니다."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "기존 비밀 번호가 틀렸습니다"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "사용자 저장 오류; 무효한 사용자"
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "새 비밀번호를 저장 할 수 없습니다."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "비밀 번호 저장"
msgid "Server"
msgstr "SSL 서버"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr ""
msgid "Path"
msgstr "경로"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "사이트 테마"
msgid "Locale directory"
msgstr "테마 디렉터리"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr ""
msgid "Fancy URLs"
msgstr ""
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "테마"
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "사람 찾기"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "올바른 메일 주소가 아닙니다."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "%s 태그된 통지"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "이용자를 업데이트 할 수 없습니다."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "해당하는 페이지 없음"
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "플러그인"
msgid "Default plugins"
msgstr "기본 언어"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "옳지 않은 크기"
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "올바르지 않은 태그: \"%s\""
msgid "Restore account"
msgstr "새 계정 만들기"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr ""
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "공개 stream을 불러올 수 없습니다."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "공개 타임라인, %d 페이지"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "퍼블릭 타임라인"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "%s 그룹을 위한 공지피드 (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "%s 그룹을 위한 공지피드 (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
#, fuzzy
msgid "Public Stream Feed (Atom)"
msgstr "퍼블릭 스트림 피드"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
msgstr ""
"%%site.name%% 의 공개 타임라인이지만, 아직 아무도 글을 쓰지 않았습니다."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
#, fuzzy
msgid "Be the first to post!"
msgstr "글을 올린 첫번째 사람이 되세요!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"friends, family, and colleagues! ([Read more](%%doc.help%%))"
msgstr ""
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, fuzzy, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "그룹, %d페이지"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "설명"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr ""
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "그룹 행동"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "게시글이 등록되었습니다."
+msgid "Notice"
+msgstr "통지"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "태그 %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "이용자 프로필"
msgid "Tag user"
msgstr "태그 사용자"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"사용자를 위한 태그 (문자,숫자, -, . ,그리고 _), 콤마 혹은 공백으로 분리하세"
"요."
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "올바르지 않은 태그: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"GNU 일반 공중 사용 허가서는 이 프로그램과 함께 제공됩니다. 만약, 이 문서가 누"
"락되어 있다면 %s 페이지를 보십시오."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "플러그인"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "이름"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "사용자 동작"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "프로필 설정"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "편집"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "이 회원에게 직접 메시지를 보냅니다."
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "메시지"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr ""
+
+#. TRANS: Label text on user profile to select a user role.
+#, fuzzy
+msgid "User role"
+msgstr "이용자 프로필"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "관리자"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "디자인 설정을 저장할 수 없습니다."
+msgid "Home"
+msgstr "홈페이지"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "메일 주소 확인"
msgid_plural "You are a member of these groups:"
msgstr[0] "당신은 해당 그룹의 멤버가 아닙니다."
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "실행결과"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "알림을 켤 수 없습니다."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "알림을 끌 수 없습니다."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "이 회원을 구독합니다."
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "이 사용자로부터 구독취소합니다."
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "%s에게 직접 메시지"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "프로필 정보"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "이 게시글에 대해 답장하기"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "이 게시글에 대해 답장하기"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "알려지지 않은 행동"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "이용자 삭제"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "명령이 아직 실행되지 않았습니다."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "데이터베이스 오류"
-msgid "Home"
-msgstr "홈페이지"
-
msgid "Public"
msgstr "공개"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "그룹의 위치, \"시/군/구, 도, 국가\""
+msgid "Aliases"
+msgstr ""
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "그룹 행동"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "가장 많은 회원수를 가진 그룹들"
msgid "Notice repeated"
msgstr "게시글이 등록되었습니다."
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "이 사용자 찔러 보기"
msgid "User %1$s (%2$d) has no profile record."
msgstr "이용자가 프로필을 가지고 있지 않습니다."
-msgid "Edit Avatar"
-msgstr "아바타 편집"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "사용자 동작"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "프로필 설정"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "편집"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "이 회원에게 직접 메시지를 보냅니다."
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "메시지"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr ""
-
-#. TRANS: Label text on user profile to select a user role.
-#, fuzzy
-msgid "User role"
-msgstr "이용자 프로필"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "관리자"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr ""
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "로그인하고 있지 않습니다."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s 타임라인"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "이 사이트에 있는 사람 찾기"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "올바르지 않은 태그: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:22+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:10+0000\n"
"Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: mk\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "%s групи"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%1$s групи кадешто членува %2$s."
msgstr "Може само да бендисува забелешки."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
-msgstr "Непозната белешка."
+msgid "Unknown notice."
+msgstr "Ð\9dепознаÑ\82а забелеÑ\88ка."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
msgid "Already a favorite."
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Не можеше да се создаде програмот."
+msgid "Invalid image."
+msgstr "Неважечка слика."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Нова група"
"Ова е Вашето излезно сандче, во кое се наведени приватните пораки кои ги "
"имате испратено."
+#. TRANS: Title for page where to change password.
+msgctxt "TITLE"
msgid "Change password"
-msgstr "Ð\9fÑ\80омени Ñ\98а лозинкаÑ\82а"
+msgstr "Смени лозинка"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Променете си ја лозинката."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Промена на лозинка"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Стара лозинка"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Нова лозинка"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "6 или повеќе знаци."
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Потврди"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "Исто како лозинката погоре."
+#. TRANS: Button text on page where to change password.
+msgctxt "BUTTON"
msgid "Change"
-msgstr "Ð\9fÑ\80омени"
+msgstr "Ð\98змени"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Лозинката мора да содржи барем 6 знаци."
msgid "Passwords don't match."
msgstr "Лозинките не се совпаѓаат."
-msgid "Incorrect old password"
-msgstr "Неточна стара лозинка"
+#. TRANS: Form validation error on page where to change password.
+msgid "Incorrect old password."
+msgstr "Погрешна стара лозинка."
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Грешка во зачувувањето на корисникот; неправилен."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
msgid "Cannot save new password."
msgstr "Не можам да ја зачувам новата лозинка."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Лозинката е зачувана."
msgid "Server"
msgstr "Опслужувач"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Назив на домаќинот на опслужувачот на мрежното место"
msgid "Path"
msgstr "Патека"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Патека на мреж. место."
msgid "Locale directory"
msgstr "Директориум на места"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Патека на директориумот на местата."
msgid "Fancy URLs"
msgstr "Интересни URL-адреси"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Да користам интересни (почитливи и повпечатливи) URL-адреси?"
+#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Изглед"
msgstr "Директориумот кадешто се сместени прилозите."
#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Пребарување на луѓе"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Не е важечка ознака за луѓе: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Користници самоозначени со %1$s - стр. %2$d"
msgid "Disabled"
msgstr "Оневозможено"
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Ова дејство прифаќа само POST-барања"
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
msgid "You cannot administer plugins."
msgstr "Не можете да раководите со приклучоци."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
msgid "No such plugin."
msgstr "Нема таков приклучок."
msgstr "Овозможено"
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Приклучоци"
msgid "Default plugins"
msgstr "Основни приклучоци"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
"Сите основни приклучоци се оневозможени во поставките на мрежното место."
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Неважечка содржина на забелешката."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"Лиценцата на забелешката „%1$s“ не е соодветна на лиценцата на мрежното "
"место „%2$s“."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Неважечка ознака: „%s“."
msgid "Restore account"
msgstr "Врати сметка"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Надминато е ограничувањето на страницата (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Не можам да го вратам јавниот поток."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Јавна историја, стр. %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Јавна историја"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Канал на јавниот поток (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Канал на јавниот поток (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Канал на јавниот поток (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
msgstr ""
"Ова е јавната историја за %%site.name%%, но досега никој ништо нема објавено."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Создајте ја првата забелешка!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Зошто не [регистрирате сметка](%%action.register%%) и станете првиот "
"објавувач!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"си споделувате забелешки за себе со приајтелите, семејството и колегите! "
"([Прочитајте повеќе](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Група %1$s, стр. %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Забелешка"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Алијаси"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Групни дејства"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Избришана забелешка"
+msgid "Notice"
+msgstr "Забелешки"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Означи %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Кориснички профил"
msgid "Tag user"
msgstr "Означи корисник"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Ознаки за овој корисник (букви, бројки, -, . и _), одделени со запирка или "
"празно место"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Неважечка ознака: „%s“"
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Треба да имате добиено примерок од Општата јавна лиценца ГНУ Аферо заедно со "
"овој програм. Ако ја немате, погледајте %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Приклучоци"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Име"
msgid "No AtomPub API service for %s."
msgstr "Нема служба за API на AtomPub за %s."
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Кориснички дејства"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Бришењето на корисникот е во тек..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Уреди нагодувања на профилот"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Уреди"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Испрати му директна порака на корисников"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Порака"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Модерирај"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Корисничка улога"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Администратор"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Модератор"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Write a reply..."
msgstr "Напишете одговор..."
-#, fuzzy
msgid "Status"
-msgstr "StatusNet"
+msgstr "Статус"
#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set.
#. TRANS: Text between [] is a link description, text between () is the link itself.
msgid "Unable to delete design setting."
msgstr "Не можам да ги избришам нагодувањата за изглед."
+msgid "Home"
+msgstr "Домашна страница"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Основни нагодувања на мрежното место"
msgstr[0] "Не ни го испративте тој профил."
msgstr[1] "Не ни го испративте тој профил."
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Наредби:\n"
-"on - вклучи известувања\n"
-"off - исклучи известувања\n"
-"help - прикажи ја оваа помош\n"
-"follow <nickname> - претплати се на корисник\n"
-"groups - список на групи кадешто членувате\n"
-"subscriptions - список на луѓе кои ги следите\n"
-"subscribers - список на луѓе кои Ве следат\n"
-"leave <nickname> - откажи претплата на корисник\n"
-"d <nickname> <text> - директна порака за корисник\n"
-"get <nickname> - прикажи последна забелешка на корисник\n"
-"whois <nickname> - прикажи профилни информации за корисник\n"
-"fav <nickname> - додај ја последната забелешка на корисникот во бендисани\n"
-"fav #<notice_id> - додај забелешка со даден id како бендисана\n"
-"repeat #<notice_id> - повтори забелешка со даден id\n"
-"repeat <nickname> - повтори последна забелешка на корисник\n"
-"reply #<notice_id> - одговори на забелешка со даден id\n"
-"reply <nickname> - одговори на последна забелешка на корисник\n"
-"join <group> - зачлени се во група\n"
-"login - Дај врска за најавување на посредникот\n"
-"drop <group> - напушти група\n"
-"stats - прикажи мои статистики\n"
-"stop - исто што и 'off'\n"
-"quit - исто што и 'off'\n"
-"sub <nickname> - исто што и 'follow'\n"
-"unsub <nickname> - исто што и 'leave'\n"
-"last <nickname> - исто што и 'get'\n"
-"on <nickname> - сè уште не е имплементирано.\n"
-"off <nickname> - сè уште не е имплементирано.\n"
-"nudge <nickname> - потсети корисник да поднови.\n"
-"invite <phone number> - сè уште не е имплементирано.\n"
-"track <word> - сè уште не е имплементирано.\n"
-"untrack <word> - сè уште не е имплементирано.\n"
-"track off - сè уште не е имплементирано.\n"
-"untrack all - сè уште не е имплементирано.\n"
-"tracks - сè уште не е имплементирано.\n"
-"tracking - сè уште не е имплементирано.\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Резултати од наредбата"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Не можам да вклучам известување."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Не можам да исклучам известување."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Претплати се на корисников"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Откажи претплата од овој корсиник"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Директни пораки до %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Далечинскиот профил не е група!"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Повтори ја забелешкава"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Одговори на забелешкава"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Непозната група."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Избриши група"
+
+#. TRANS: Help message for IM/SMS command "stats"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr "Подновете си го статусот..."
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Наредбата сè уште не е имплементирана."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "No configuration file found."
msgid "Database error"
msgstr "Грешка во базата на податоци"
-msgid "Home"
-msgstr "Домашна страница"
-
msgid "Public"
msgstr "Јавен"
msgstr ""
"Местоположба на групата (ако има). На пр. „Град, Сој. држава/област, Земја“"
+msgid "Aliases"
+msgstr "Алијаси"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Додавање или уредување на изгледот на групата „%s“"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Групни дејства"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Групи со највеќе членови"
msgstr "од"
msgid "Can't get author for activity."
-msgstr ""
+msgstr "Не можам да го добијам авторот за активноста."
-#, fuzzy
msgid "Bookmark not posted to this group."
-msgstr "Ð\9dе Ð\92и е дозволено да Ñ\98а избÑ\80иÑ\88еÑ\82е оваа гÑ\80Ñ\83па."
+msgstr "Ð\9dа оваа гÑ\80Ñ\83па не е обÑ\98авен одбележÑ\83ваÑ\87."
-#, fuzzy
msgid "Object not posted to this user."
-msgstr "Ð\9dе го бÑ\80иÑ\88и коÑ\80иÑ\81ников."
+msgstr "Ð\9eбÑ\98екÑ\82оÑ\82 не мÑ\83 е иÑ\81пÑ\80аÑ\82ен на овоÑ\98 коÑ\80иÑ\81ник."
msgid "Don't know how to handle this kind of target."
-msgstr ""
+msgstr "Не знам како да работам со ваква одредница."
#. TRANS: Validation error in form for registration, profile and group settings, etc.
msgid "Nickname cannot be empty."
msgid "Notice repeated"
msgstr "Забелешката е повторена"
+msgid "Update your status..."
+msgstr "Подновете си го статусот..."
+
msgid "Nudge this user"
msgstr "Подбуцни го корисников"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Корисникот %1$s (%2$d) нема профилен запис."
-msgid "Edit Avatar"
-msgstr "Уреди аватар"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Кориснички дејства"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Бришењето на корисникот е во тек..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Уреди нагодувања на профилот"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Уреди"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Испрати му директна порака на корисников"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Порака"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Модерирај"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Корисничка улога"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Администратор"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Модератор"
-
msgid "Not allowed to log in."
msgstr "Не Ви е дозволено да се најавите."
msgid "Getting backup from file '%s'."
msgstr "Земам резерва на податотеката „%s“."
-#~ msgid "Friends timeline"
-#~ msgstr "Историја на пријатели"
-
-#~ msgid "Everyone on this site"
-#~ msgstr "Сите на ова мрежно место"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Неважечка ознака: „%s“"
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:23+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:11+0000\n"
"Language-Team: Malayalam <http://translatewiki.net/wiki/Portal:ml>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ml\n"
"X-Message-Group: #out-statusnet-core\n"
msgid "%s's groups"
msgstr "%s എന്ന ഉപയോക്താവിന്റെ സംഘങ്ങൾ"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%2$s അംഗമായ %1$s സംഘങ്ങൾ."
msgstr "അറിയിപ്പുകൾ മാത്രമേ പ്രിയങ്കരമാണെന്ന് കുറിക്കാനാവൂ."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+#, fuzzy
+msgid "Unknown notice."
msgstr "അജ്ഞാതമായ കുറിപ്പ്."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr ""
+#, fuzzy
+msgid "Invalid image."
+msgstr "അസാധുവായ വലിപ്പം."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "പുതിയ സംഘം"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "ഇത് താങ്കളുടെ ഔട്ട്ബോക്സ് ആണ്, താങ്കൾ അയച്ച സ്വകാര്യ സന്ദേശങ്ങൾ ഇവിടെ കാണാം."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "രഹസ്യവാക്ക് മാറ്റുക"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "താങ്കളുടെ രഹസ്യവാക്ക് മാറ്റുക."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "രഹസ്യവാക്ക് മാറ്റൽ"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "പഴയ രഹസ്യവാക്ക്"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "പുതിയ രഹസ്യവാക്ക്"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "ആറോ അതിലധികമോ അക്ഷരങ്ങൾ."
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "സ്ഥിരീകരിക്കുക"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "മുകളിൽ നൽകിയ അതേ രഹസ്യവാക്ക്."
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "മാറ്റുക"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "രഹസ്യവാക്കിന് ആറോ അതിലധികമോ അക്ഷരങ്ങളുണ്ടായിരിക്കണം."
msgid "Passwords don't match."
msgstr "രഹസ്യവാക്കുകൾ തമ്മിൽ യോജിക്കുന്നില്ല"
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "പഴയ രഹസ്യവാക്ക് തെറ്റാണ്"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "ഉപയോക്താവിനെ സേവ് ചെയ്യുന്നതിൽ പിഴവുണ്ടായി; അസാധുവാണ്."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
msgid "Cannot save new password."
msgstr "പുതിയ രഹസ്യവാക്ക് സേവ് ചെയ്യാനാവില്ല."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "രഹസ്യവാക്ക് സേവ് ചെയ്തിരിക്കുന്നു."
msgid "Server"
msgstr "സെർവർ"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr ""
msgid "Path"
msgstr ""
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr ""
msgid "Locale directory"
msgstr ""
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr ""
msgid "Fancy URLs"
msgstr "അലങ്കൃത യൂ.ആർ.എല്ലുകൾ"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "അലങ്കൃത (വായിക്കാനും ഓർത്തിരിക്കാനും എളുപ്പമായവ) യൂ.ആർ.എല്ലുകൾ ഉപയോഗിക്കണോ?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "ദൃശ്യരൂപം"
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "എസ്.എസ്.എൽ."
msgid "People search"
msgstr "ആൾക്കാരെ തിരയുക"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr ""
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr ""
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "താങ്കൾക്ക് ഉപയോക്താക്കളെ നീക്കം ചെയ്യാൻ കഴിയില്ല."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "അത്തരത്തിൽ ഒരു താളില്ല."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "പ്ലഗിനുകൾ"
msgid "Default plugins"
msgstr "സ്വതേ വേണ്ട ഭാഷ"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "അറിയിപ്പിന്റെ ഉള്ളടക്കം അസാധുവാണ്."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"അറിയിപ്പിന്റെ ഉപയോഗാനുമതിയായ് ‘%1$s’ സൈറ്റിന്റെ ഉപയോഗാനുമതിയായ ‘%2$s’ എന്നതുമായി "
"ചേർന്നു പോകുന്നില്ല."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "അസാധുവായ റ്റാഗ്: \"%s\""
msgid "Restore account"
msgstr "അംഗത്വം പുനഃക്രമീകരിക്കുക"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "താളിന്റെ പരിധിയ്ക്ക് (%s) പുറത്താണ്."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr ""
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "സാർവ്വജനിക സമയരേഖ, താൾ %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "സാർവ്വജനിക സമയരേഖ"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr ""
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr ""
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr ""
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "പ്രസിദ്ധീകരിക്കുന്ന ആദ്യ വ്യക്തിയാകുക!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"എന്തുകൊണ്ട് [അംഗത്വമെടുക്കുകയും](%%action.register%%) പ്രസിദ്ധീകരിക്കുന്ന ആദ്യ വ്യക്തിയാകുകയും "
"ചെയ്തുകൂട!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"സഹപ്രവർത്തകരുമായും പങ്ക് വെയ്ക്കുവാൻ [ഇപ്പോൾ തന്നെ ചേരുക](%%action.register%%)! (കൂടുതൽ "
"അറിയുക](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "%1$s സംഘം, താൾ %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "കുറിപ്പ്"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr ""
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "സംഘത്തിന്റെ പ്രവൃത്തികൾ"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "അറിയിപ്പ് മായ്ച്ചിരിക്കുന്നു."
+#, fuzzy
+msgid "Notice"
+msgstr "അറിയിപ്പുകൾ"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "റ്റാഗ് %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr ""
msgstr "ഉപയോക്താവിനെ റ്റാഗ് ചെയ്യുക"
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "അസാധുവായ റ്റാഗ്: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "പ്ലഗിനുകൾ"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "പേര്"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "ഉപയോക്തൃ പ്രവൃത്തികൾ"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "ഉപയോക്താവിനെ നീക്കം ചെയ്യൽ പുരോഗമിക്കുന്നു..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "ക്രമീകരണങ്ങളുടെ സജ്ജീകരണം മാറ്റുക"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "തിരുത്തുക"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "ഈ ഉപയോക്താവിന് നേരിട്ട് സന്ദേശമയയ്ക്കുക"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "സന്ദേശം"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "മാദ്ധ്യസ്ഥം വഹിക്കുക"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr ""
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "കാര്യനിർവ്വാഹക(ൻ)"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "മദ്ധ്യസ്ഥ(ൻ)"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "രൂപകല്പനാ സജ്ജീകരണങ്ങൾ മായ്ക്കാൻ കഴിഞ്ഞില്ല."
+#, fuzzy
+msgid "Home"
+msgstr "ഹോംപേജ്"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "സൈറ്റിന്റെ അടിസ്ഥാന ക്രമീകരണം"
msgstr[0] "താങ്കൾ ഈ സംഘത്തിലെ അംഗമാണ്:"
msgstr[1] "താങ്കൾ ഈ സംഘങ്ങളിലെ അംഗമാണ്:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on"
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "off"
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "ഈ ഉപയോക്താവിന്റെ വരിക്കാരൻ/വരിക്കാരി ആകുക"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "ഈ ഉപയോക്താവിന്റെ വരിക്കാരൻ/വരിക്കാരി ആകുക"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "%s എന്ന ഉപയോക്താവിന് നേരിട്ടുള്ള സന്ദേശങ്ങൾ"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "ഈ അറിയിപ്പ് ആവർത്തിക്കുക"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "ഈ അറിയിപ്പിന് മറുപടിയിടുക"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "അജ്ഞാത സംഘം."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "സംഘം മായ്ക്കുക"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "പ്രാവർത്തികമാക്കിയിട്ടില്ല."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "ഡാറ്റാബേസ് പിഴവ്"
-#, fuzzy
-msgid "Home"
-msgstr "ഹോംപേജ്"
-
msgid "Public"
msgstr "സാർവ്വജനികം"
"സംഘത്തിന്റെ പ്രദേശം, അങ്ങനെയൊന്നുണ്ടെങ്കിൽ - ഉദാ: \"പട്ടണം, സംസ്ഥാനം (അഥവാ പ്രദേശം), "
"രാജ്യം\"."
+msgid "Aliases"
+msgstr ""
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "%s എന്ന സംഘത്തിനു രൂപകല്പന കൂട്ടിച്ചേർക്കുക അല്ലെങ്കിൽ മാറ്റം വരുത്തുക"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "സംഘത്തിന്റെ പ്രവൃത്തികൾ"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr ""
msgid "Notice repeated"
msgstr "അറിയിപ്പ് ആവർത്തിച്ചിരിക്കുന്നു"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr ""
msgid "User %1$s (%2$d) has no profile record."
msgstr ""
-msgid "Edit Avatar"
-msgstr ""
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "ഉപയോക്തൃ പ്രവൃത്തികൾ"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "ഉപയോക്താവിനെ നീക്കം ചെയ്യൽ പുരോഗമിക്കുന്നു..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "ക്രമീകരണങ്ങളുടെ സജ്ജീകരണം മാറ്റുക"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "തിരുത്തുക"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "ഈ ഉപയോക്താവിന് നേരിട്ട് സന്ദേശമയയ്ക്കുക"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "സന്ദേശം"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "മാദ്ധ്യസ്ഥം വഹിക്കുക"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr ""
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "കാര്യനിർവ്വാഹക(ൻ)"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "മദ്ധ്യസ്ഥ(ൻ)"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "ലോഗിൻ ചെയ്തിട്ടില്ല"
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s എന്ന ഉപയോക്താവിന്റെ സമയരേഖ"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "ഈ സൈറ്റിലെ ആൾക്കാരെ കണ്ടെത്തുക"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "അസാധുവായ റ്റാഗ്: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:26+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:14+0000\n"
"Language-Team: Norwegian (bokmål) <http://translatewiki.net/wiki/Portal:no>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: no\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "%s sine grupper"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%1$s grupper %2$s er et medlem av."
msgstr "Finn innhold i notiser"
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+#, fuzzy
+msgid "Unknown notice."
msgstr "Ukjent notat."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Kunne ikke opprette program."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Ugyldig størrelse"
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Ny gruppe"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "Dette er utboksen din som viser alle private meldinger du har sendt."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Endre passord"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Endre passordet ditt."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Endre passord"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Gammelt passord"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nytt passord"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 eller flere tegn"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Bekreft"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Samme som passord ovenfor"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Endre"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Passord må være minst 6 tegn."
msgid "Passwords don't match."
msgstr "Passordene var ikke like."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Feil gammelt passord"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Feil ved lagring av bruker; ugyldig."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Klarer ikke å lagre nytt passord."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Passordet ble lagret"
msgid "Server"
msgstr "Tjener"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Vertsnavn for nettstedets tjener."
msgid "Path"
msgstr "Sti"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Nettstedssti."
msgid "Locale directory"
msgstr "Temamappe"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Directory path to locales."
msgstr "Lokaliseringsmappesti"
msgid "Fancy URLs"
msgstr "Pyntede nettadresser"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Bruk pyntede (mer lesbare og lettere å huske) nettadresser?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Tema"
msgstr "Mappen vedlegg er plassert i."
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Personsøk"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Ikke en gyldig personmerkelapp: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Brukere som har merket seg selv med %1$s - side %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Du kan ikke slette brukere."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Ingen slik side."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Programtillegg"
msgid "Default plugins"
msgstr "Standardspråk"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Ugyldig notisinnhold."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "Notislisensen ‘%1$s’ er ikke kompatibel med nettstedslisensen ‘%2$s’."
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Ugyldig merkelapp: «%s»"
msgid "Restore account"
msgstr "Opprett en konto"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Over sidegrensen (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Kunne ikke hente offentlig strøm."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Offentlig tidslinje, side %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Offentlig tidslinje"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Offentlig strømmating (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Offentlig strømmating (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Offentlig strømmating (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Dette er den offentlige tidslinjen for %%site.name%% men ingen har postet "
"noe ennå."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Vær den første til å poste!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Hvorfor ikke [registrere en konto](%%action.register%%) og vær den første "
"til å poste!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"(http://status.net). [Bli med nå](%%action.register%%) for å dele notiser om "
"degselv med venner, familie og kollegaer! ([Les mer](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "%1$s gruppe, side %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Merk"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Alias"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Gruppehandlinger"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Notis slettet."
+#, fuzzy
+msgid "Notice"
+msgstr "Notiser"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Merk %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Brukerprofil"
#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Merkelapper for degselv (bokstaver, nummer, -, ., og _), adskilt med komma "
"eller mellomrom"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Ugyldig merkelapp: «%s»"
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Programtillegg"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Navn"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+#, fuzzy
+msgid "User actions"
+msgstr "Gruppehandlinger"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Endre profilinnstillinger"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Rediger"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Send en direktemelding til denne brukeren"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Melding"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderer"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Brukerrolle"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrator"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Kunne ikke lagre dine innstillinger for utseende."
+msgid "Home"
+msgstr "Hjemmesiden"
+
#. TRANS: Menu item title/tooltip
#, fuzzy
msgid "Basic site configuration"
msgstr[0] "Du er allerede logget inn!"
msgstr[1] "Du er allerede logget inn!"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Kommandoresultat"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Kan ikke gjenta din egen notis."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Kan ikke gjenta din egen notis."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Abonner på denne brukeren"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Abonner på denne brukeren"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Direktemeldinger til %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Profilinformasjon"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Repeter denne notisen"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Svar på denne notisen"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Ukjent"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Slett gruppe"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Beklager, denne kommandoen er ikke implementert ennå."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr "Databasefeil"
-msgid "Home"
-msgstr "Hjemmesiden"
-
msgid "Public"
msgstr "Offentlig"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "Hvor du er, for eksempel «By, fylke (eller region), land»"
+msgid "Aliases"
+msgstr "Alias"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Gruppehandlinger"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Grupper med flest medlemmer"
msgid "Notice repeated"
msgstr "Notis repetert"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Knuff denne brukeren"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Brukeren har ingen profil."
-#, fuzzy
-msgid "Edit Avatar"
-msgstr "Brukerbilde"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-#, fuzzy
-msgid "User actions"
-msgstr "Gruppehandlinger"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Endre profilinnstillinger"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Rediger"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Send en direktemelding til denne brukeren"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Melding"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderer"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Brukerrolle"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrator"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderator"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Ikke logget inn."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s tidslinje"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Finn personer på dette nettstedet"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Ugyldig merkelapp: «%s»"
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:24+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:12+0000\n"
"Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: nl\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Groepen van %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Groepen op de site %1$s waar %2$s lid van is."
msgstr "Het is alleen mogelijk om mededelingen als favoriet aan te merken."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
-msgstr "Onbekend mededeling."
+msgid "Unknown notice."
+msgstr "Onbekende mededeling."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
msgid "Already a favorite."
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Het was niet mogelijk de applicatie aan te maken."
+msgid "Invalid image."
+msgstr "Ongeldige afbeelding."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Nieuwe groep"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "Dit is uw Postvak UIT waarin de door u verzonden privéberichten staan."
+#. TRANS: Title for page where to change password.
+msgctxt "TITLE"
msgid "Change password"
msgstr "Wachtwoord wijzigen"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Wachtwoord wijzigen"
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Wachtwoord wijzigen"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Huidige wachtwoord"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nieuw wachtwoord"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "Zes of meer tekens"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Bevestigen"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "Gelijk aan het wachtwoord hierboven."
+#. TRANS: Button text on page where to change password.
+msgctxt "BUTTON"
msgid "Change"
msgstr "Wijzigen"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Het wachtwoord moet zes of meer tekens bevatten."
msgid "Passwords don't match."
msgstr "De wachtwoorden komen niet overeen."
-msgid "Incorrect old password"
-msgstr "Het oude wachtwoord is onjuist"
+#. TRANS: Form validation error on page where to change password.
+msgid "Incorrect old password."
+msgstr "Het oude wachtwoord is onjuist."
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Fout bij opslaan gebruiker; ongeldig."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
msgid "Cannot save new password."
msgstr "Het was niet mogelijk het nieuwe wachtwoord op te slaan."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Het wachtwoord is opgeslagen."
msgid "Server"
msgstr "Server"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Hostnaam van de website server."
msgid "Path"
msgstr "Pad"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Websitepad."
msgid "Locale directory"
msgstr "Map voor taalondersteuning"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Map voor taalondersteuning."
msgid "Fancy URLs"
msgstr "Nette URL's"
-msgid "Use fancy (more readable and memorable) URLs?"
-msgstr "Nette URL's (meer leesbaar en beter te onthouden) gebruiken?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
+msgstr "Nette URL's gebruiken (beter leesbaar en beter te onthouden)?"
+#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Vormgeving"
msgstr "Map waar bijlagen worden opgeslagen."
#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Gebruikers zoeken"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Geen geldig gebruikerslabel: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Gebruikers die zichzelf met %1$s hebben gelabeld - pagina %2$d"
msgid "Disabled"
msgstr "Uitgeschakeld"
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Deze handeling accepteert alleen POST-verzoeken."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
msgid "You cannot administer plugins."
msgstr "U kunt plug-ins niet beheren."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
msgid "No such plugin."
msgstr "Deze plug-in bestaat niet."
msgstr "Ingeschakeld"
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Plug-ins"
msgid "Default plugins"
msgstr "Standaard plug-ins"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
"Alle standaard plug-ins zijn uitgeschakeld in het bestand met "
"siteinstellingen."
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Ongeldige mededelinginhoud."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"De mededelingenlicentie \"%1$s\" is niet compatibel met de licentie \"%2$s\" "
"van deze site."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Ongeldig label: \"%s\"."
msgid "Restore account"
msgstr "Gebruiker terugladen van back-up"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Meer dan de paginalimiet (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Het was niet mogelijk de publieke stream op te halen."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Openbare tijdlijn, pagina %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Openbare tijdlijn"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Publieke streamfeed (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Publieke streamfeed (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Publieke streamfeed (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Dit is de publieke tijdlijn voor %%site.name%%, maar niemand heeft nog "
"berichten geplaatst."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "U kunt de eerste zijn die een bericht plaatst!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Waarom [registreert u geen gebruiker](%%action.register%%) en plaatst u als "
"eerste een bericht?"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"net/). [Registreer nu](%%action.register%%) om mededelingen over uzelf te "
"delen met vrienden, familie en collega's! [Meer lezen...](%%doc.help%%)"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Groep %1$s, pagina %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Opmerking"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Aliassen"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Groepshandelingen"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Deze mededeling is verwijderd."
+msgid "Notice"
+msgstr "Mededeling"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Label %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Gebruikersprofiel"
msgid "Tag user"
msgstr "Gebruiker labelen"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Labels voor deze gebruiker (letters, cijfers, -, ., en _). Gebruik komma's "
"of spaties als scheidingsteken"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Ongeldig label: '%s'"
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Samen met dit programma hoort u een kopie van de GNU Affero General Public "
"License te hebben ontvangen. Zo niet, zie dan %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Plug-ins"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Naam"
msgid "No AtomPub API service for %s."
msgstr "Er is geen AtomPub API-dienst voor %s."
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Gebruikershandelingen"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Bezig met het verwijderen van de gebruiker..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Profielinstellingen bewerken"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Bewerken"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Deze gebruiker een direct bericht zenden"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Bericht"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Modereren"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Gebruikersrol"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Beheerder"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Write a reply..."
msgstr "Schrijf een antwoord..."
-#, fuzzy
msgid "Status"
-msgstr "StatusNet"
+msgstr "Status"
#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set.
#. TRANS: Text between [] is a link description, text between () is the link itself.
msgid "Unable to delete design setting."
msgstr "Het was niet mogelijk om de ontwerpinstellingen te verwijderen."
+msgid "Home"
+msgstr "Start"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Basisinstellingen voor de website"
msgstr[0] "U bent lid van deze groep:"
msgstr[1] "U bent lid van deze groepen:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Commando's:\n"
-"on - notificaties inschakelen\n"
-"off - notificaties uitschakelen\n"
-"help - deze hulptekst weergeven\n"
-"follow <gebruiker> - abonneren op gebruiker\n"
-"groups - geef uw groepslidmaatschappen weer\n"
-"subscriptions - geeft uw gebruikersabonnenmenten weer\n"
-"subscribers - geeft de gebruikers die een abonnement op u hebben weer\n"
-"leave <gebruiker> - abonnement op gebruiker opzeggen\n"
-"d <gebruiker> <tekst> - direct bericht aan gebruiker\n"
-"get <gebruiker> - laatste mededeling van gebruiker opvragen\n"
-"whois <gebruiker> - profielinformatie van gebruiker opvragen\n"
-"lose <gebruiker> - zorgt ervoor dat de gebruiker u niet meer volgt\n"
-"fav <gebruiker> - laatste mededeling van gebruiker op favorietenlijst "
-"zetten\n"
-"fav #<mededeling-ID> - mededelingen met aangegeven ID op favorietenlijst "
-"zetten\n"
-"repeat #<mededeling-ID> - herhaal een mededelingen met een opgegeven ID\n"
-"repeat <gebruiker> - herhaal de laatste mededelingen van gebruiker\n"
-"reply #<mededeling-ID> - antwoorden op de mededeling met het aangegeven ID\n"
-"reply <gebruiker> - antwoorden op de laatste mededeling van gebruiker\n"
-"join <groep> - lid worden van groep\n"
-"login - verwijzing opvragen naar de webpagina voor aanmelden\n"
-"drop <groep> - groepslidmaatschap opzeggen\n"
-"stats - uw statistieken opvragen\n"
-"stop - zelfde als 'off'\n"
-"quit - zelfde als 'off'\n"
-"sub <gebruiker> - zelfde als 'follow'\n"
-"unsub <gebruiker> - zelfde als 'leave'\n"
-"last <gebruiker> - zelfde als 'get'\n"
-"on <gebruiker> - nog niet beschikbaar\n"
-"off <gebruiker> - nog niet beschikbaar\n"
-"nudge <gebruiker> - gebruiker porren\n"
-"invite <phone number> - nog niet beschikbaar\n"
-"track <word> - nog niet beschikbaar\n"
-"untrack <word> - nog niet beschikbaar\n"
-"track off - nog niet beschikbaar\n"
-"untrack all - nog niet beschikbaar\n"
-"tracks - nog niet beschikbaar\n"
-"tracking - nog niet beschikbaar\n"
+#. TRANS: Header line of help text for commands.
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Commando's:"
+
+#. TRANS: Help message for IM/SMS command "on"
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "meldingen inschakelen"
+
+#. TRANS: Help message for IM/SMS command "off"
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "meldingen uitschakelen"
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr "de hulptekst weergeven"
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "abonneren op gebruiker"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr "geeft de groepen waar u lid van bent weer"
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr "geeft de mensen die u volgt weer"
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr "geeft de mensen die u volgen weer"
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "abonnement op gebruiker opzeggen"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "privébericht aan gebruiker"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr "haal de laastste mededdeling van gebruiker op"
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "profielgegevens van gebruiker ophalen"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr "dwing gebruiker u niet langer te volgen"
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr "voegt de laatste mededeling van gebruiker toe als favoriet"
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr "voegt mededeling met het opgegeven ID toe als favoriet"
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr "herhaalt de mededeling met het opgegeven ID"
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "de laatste mededeling van gebruiker herhalen"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr "antwoorden op mededeling met het opgegeven ID"
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "op de laatste mededeling van gebruiker antwoorden"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "lid worden van groep"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr "Haal een verwijzing op naar het aanmeldscherm voor de webinterface"
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "groep verlaten"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr "uw statistieken ophalen"
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr "hetzelfde als \"uit\""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr "hetzelfde als 'follow'"
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr "hetzelfde als 'leave'"
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr "hetzelfde als 'get'"
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "nog niet geïmplementeerd."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr "herinner een gebruiker eraan bij te werken."
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "No configuration file found."
msgid "Database error"
msgstr "Databasefout"
-msgid "Home"
-msgstr "Start"
-
msgid "Public"
msgstr "Openbaar"
msgstr ""
"Locatie voor de groep - als relevant. Iets als \"Plaats, regio, land\"."
+msgid "Aliases"
+msgstr "Aliassen"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Vormgeving van de groep %s toevoegen of aanpassen"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Groepshandelingen"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Groepen met de meeste leden"
msgstr "van"
msgid "Can't get author for activity."
-msgstr ""
+msgstr "Het was niet mogelijk de auteur te achterhalen voor de activiteit."
-#, fuzzy
msgid "Bookmark not posted to this group."
-msgstr "U mag deze groep niet verwijderen."
+msgstr "De bladwijzer is niet aan deze groep verzonden."
-#, fuzzy
msgid "Object not posted to this user."
-msgstr "Deze gebruiker niet verwijderen."
+msgstr "Het object is niet aan deze gebruiker verzonden."
msgid "Don't know how to handle this kind of target."
-msgstr ""
+msgstr "Het is niet bekend hoe dit doel afgehandeld moet worden."
#. TRANS: Validation error in form for registration, profile and group settings, etc.
msgid "Nickname cannot be empty."
msgid "Notice repeated"
msgstr "Mededeling herhaald"
+msgid "Update your status..."
+msgstr "Werk uw status bij..."
+
msgid "Nudge this user"
msgstr "Deze gebruiker porren"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Gebruiker %1$s (%2$d) heeft geen profielrecord."
-msgid "Edit Avatar"
-msgstr "Avatar bewerken"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Gebruikershandelingen"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Bezig met het verwijderen van de gebruiker..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Profielinstellingen bewerken"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Bewerken"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Deze gebruiker een direct bericht zenden"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Bericht"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Modereren"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Gebruikersrol"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Beheerder"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderator"
-
msgid "Not allowed to log in."
msgstr "Aanmelden is niet toegestaan."
msgid "Getting backup from file '%s'."
msgstr "De back-up wordt uit het bestand \"%s\" geladen."
-#~ msgid "Friends timeline"
-#~ msgstr "Tijdlijn van vrienden"
-
-#~ msgid "Everyone on this site"
-#~ msgstr "Iedereen op deze site"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Ongeldig label: \"%s\"."
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:27+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:15+0000\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <http://translatewiki.net/wiki/Portal:pl>\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ( (n%10 >= 2 && n%10 <= 4 && "
"(n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: pl\n"
"X-Message-Group: #out-statusnet-core\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Grupy użytkownika %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%2$s jest członkiem grup %1$s."
msgstr "Można tylko dodawać wpisy do ulubionych."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+#, fuzzy
+msgid "Unknown notice."
msgstr "Nieznany wpis."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Nie można utworzyć aplikacji."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Nieprawidłowy rozmiar."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Nowa grupa"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "To są wiadomości wysłane, czyli prywatne wiadomości, które wysłałeś."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Zmień hasło"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Zmień hasło."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Zmiana hasła"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Poprzednie hasło"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nowe hasło"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "6 lub więcej znaków."
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Potwierdź"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "Takie samo jak powyższe hasło."
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Zmień"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Hasło musi mieć sześć lub więcej znaków."
msgid "Passwords don't match."
msgstr "Hasła nie pasują do siebie."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Niepoprawne poprzednie hasło"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Błąd podczas zapisywania użytkownika; nieprawidłowy."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
msgid "Cannot save new password."
msgstr "Nie można zapisać nowego hasła."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Zapisano hasło."
msgid "Server"
msgstr "Serwer"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Nazwa komputera serwera strony."
msgid "Path"
msgstr "Ścieżka"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Ścieżka do witryny."
msgid "Locale directory"
msgstr "Katalog lokalizacji"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Ścieżka do katalogu lokalizacji."
msgid "Fancy URLs"
msgstr "Eleganckie adresu URL"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
"Używać eleganckich (bardziej czytelnych i łatwiejszych do zapamiętania) "
"adresów URL?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Motyw"
msgstr "Katalog, w którym położone są załączniki."
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Wyszukiwanie osób"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Nieprawidłowy znacznik osób: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Użytkownicy używający znacznika %1$s - strona %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Ta czynność przyjmuje tylko żądania POST."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Nie można usuwać użytkowników."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Nie ma takiej strony."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Wtyczki"
msgid "Default plugins"
msgstr "Domyślny język"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Nieprawidłowa treść wpisu."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "Licencja wpisu \"%1$s\" nie jest zgodna z licencją witryny \"%2$s\"."
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Nieprawidłowy znacznik: \"%s\""
msgid "Restore account"
msgstr "Przywróć konto"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Poza ograniczeniem strony (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Nie można pobrać publicznego strumienia."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Publiczna oś czasu, strona %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Publiczna oś czasu"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Kanał publicznego strumienia (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Kanał publicznego strumienia (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Kanał publicznego strumienia (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"To jest publiczna oś czasu dla %%site.name%%, ale nikt jeszcze nic nie "
"wysłał."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Zostań pierwszym, który coś wyśle."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Dlaczego nie [zarejestrujesz konta](%%action.register%%) i zostaniesz "
"pierwszym, który coś wyśle."
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"[Dołącz teraz](%%action.register%%), aby dzielić się wpisami o sobie z "
"przyjaciółmi, rodziną i kolegami. ([Przeczytaj więcej](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Grupa %1$s, strona %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Wpis"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Aliasy"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Działania grupy"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Usunięto wpis."
+msgid "Notice"
+msgstr "Wpisy"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Znacznik %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Profil użytkownika"
msgid "Tag user"
msgstr "Znacznik użytkownika"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Znaczniki dla tego użytkownika (litery, liczby, -, . i _), oddzielone "
"przecinkami lub spacjami"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Nieprawidłowy znacznik: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Powszechnej Licencji Publicznej Affero GNU (GNU Affero General Public "
"License); jeśli nie - proszę odwiedzić stronę internetową %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Wtyczki"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Nazwa"
msgid "No AtomPub API service for %s."
msgstr "Brak API usługi AtomPub dla %s."
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Czynności użytkownika"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Trwa usuwanie użytkownika..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Zmodyfikuj ustawienia profilu"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Edycja"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Wyślij bezpośrednią wiadomość do tego użytkownika"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Wiadomość"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderuj"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Rola użytkownika"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrator"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Nie można usunąć ustawienia wyglądu."
+msgid "Home"
+msgstr "Strona domowa"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Podstawowa konfiguracja witryny"
msgstr[1] "Jesteś członkiem tych grup:"
msgstr[2] "Jesteś członkiem tych grup:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Polecenia:\n"
-"on - włącza powiadomienia\n"
-"off - wyłącza powiadomienia\n"
-"help - wyświetla tę pomoc\n"
-"follow <pseudonim> - subskrybuje użytkownika\n"
-"groups - wyświetla listę grup, do których dołączyłeś\n"
-"subscriptions - wyświetla listę obserwowanych osób\n"
-"subscribers - wyświetla listę osób, które cię obserwują\n"
-"leave <pseudonim> - usuwa subskrypcję użytkownika\n"
-"d <pseudonim> <tekst> - bezpośrednia wiadomość do użytkownika\n"
-"get <pseudonim> - zwraca ostatni wpis użytkownika\n"
-"whois <pseudonim> - zwraca informacje o profilu użytkownika\n"
-"lose <pseudonim> - wymusza użytkownika do zatrzymania obserwowania cię\n"
-"fav <pseudonim> - dodaje ostatni wpis użytkownika jako \"ulubiony\"\n"
-"fav #<identyfikator_wpisu> - dodaje wpis z podanym identyfikatorem jako "
-"\"ulubiony\"\n"
-"repeat #<identyfikator_wpisu> - powtarza wiadomość z zadanym "
-"identyfikatorem\n"
-"repeat <pseudonim> - powtarza ostatnią wiadomość od użytkownika\n"
-"reply #<identyfikator_wpisu> - odpowiada na wpis z podanym identyfikatorem\n"
-"reply <pseudonim> - odpowiada na ostatni wpis użytkownika\n"
-"join <grupa> - dołącza do grupy\n"
-"login - pobiera odnośnik do zalogowania się do interfejsu WWW\n"
-"drop <grupa> - opuszcza grupę\n"
-"stats - pobiera statystyki\n"
-"stop - to samo co \"off\"\n"
-"quit - to samo co \"off\"\n"
-"sub <pseudonim> - to samo co \"follow\"\n"
-"unsub <pseudonim> - to samo co \"leave\"\n"
-"last <pseudonim> - to samo co \"get\"\n"
-"on <pseudonim> - jeszcze nie zaimplementowano\n"
-"off <pseudonim> - jeszcze nie zaimplementowano\n"
-"nudge <pseudonim> - przypomina użytkownikowi o aktualizacji\n"
-"invite <numer telefonu> - jeszcze nie zaimplementowano\n"
-"track <wyraz> - jeszcze nie zaimplementowano\n"
-"untrack <wyraz> - jeszcze nie zaimplementowano\n"
-"track off - jeszcze nie zaimplementowano\n"
-"untrack all - jeszcze nie zaimplementowano\n"
-"tracks - jeszcze nie zaimplementowano\n"
-"tracking - jeszcze nie zaimplementowano\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Wyniki polecenia"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Nie można włączyć powiadomień."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Nie można wyłączyć powiadomień."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Subskrybuj tego użytkownika"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Zrezygnuj z subskrypcji tego użytkownika"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Bezpośrednia wiadomość do użytkownika %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Zdalny profil nie jest grupą."
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Powtórz ten wpis"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Odpowiedz na ten wpis"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Nieznana grupa."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Usuń grupę"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Nie zaimplementowano polecenia."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "No configuration file found."
msgid "Database error"
msgstr "Błąd bazy danych"
-msgid "Home"
-msgstr "Strona domowa"
-
msgid "Public"
msgstr "Publiczny"
"Położenie grupy, jeśli istnieje, np. \"miasto, województwo (lub region), kraj"
"\"."
+msgid "Aliases"
+msgstr "Aliasy"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Dodanie lub modyfikacja wyglądu grupy %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Działania grupy"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Grupy z największą liczbą członków"
msgid "Notice repeated"
msgstr "Powtórzono wpis"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Szturchnij tego użytkownika"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Użytkownik%1$s (%2$d) nie posiada wpisu profilu."
-msgid "Edit Avatar"
-msgstr "Zmodyfikuj awatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Czynności użytkownika"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Trwa usuwanie użytkownika..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Zmodyfikuj ustawienia profilu"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Edycja"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Wyślij bezpośrednią wiadomość do tego użytkownika"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Wiadomość"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderuj"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Rola użytkownika"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrator"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderator"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Niezalogowany."
msgid "Getting backup from file '%s'."
msgstr "Pobieranie kopii zapasowej z pliku \"%s\"."
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "Oś czasu użytkownika %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Znajdź osoby na tej witrynie"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Nieprawidłowy znacznik: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:28+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:16+0000\n"
"Language-Team: Portuguese <http://translatewiki.net/wiki/Portal:pt>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: pt\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Grupos de %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Grupos de %1$s de que %2$s é membro."
msgstr "Só pode por actualizações nos favoritos."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+#, fuzzy
+msgid "Unknown notice."
msgstr "Nota desconhecida."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Não foi possível criar a aplicação."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Tamanho inválido."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Grupo novo"
msgstr ""
"Esta é a sua caixa de saída, que apresenta as mensagens privadas que enviou."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Modificar senha"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Modificar a sua senha."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Mudança da senha"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Antiga"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nova"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "6 ou mais caracteres."
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Confirmação"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "Repita a nova senha."
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Modificar"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Senha tem de ter 6 ou mais caracteres."
msgid "Passwords don't match."
msgstr "Senhas não coincidem."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Senha antiga incorrecta."
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Erro ao guardar utilizador; inválido."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
msgid "Cannot save new password."
msgstr "Não é possível salvar a nova senha."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Senha gravada."
msgid "Server"
msgstr "Servidor"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Nome do servidor do site."
msgid "Path"
msgstr "Localização"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Localização do site."
msgid "Locale directory"
msgstr "Directório local"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Directory path to locales."
msgstr "Localização do directório das línguas"
msgid "Fancy URLs"
msgstr "URLs bonitas"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Usar URLs bonitas (mais legíveis e memoráveis)"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Tema"
msgstr "Localização do directório das línguas"
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Pesquisa de pessoas"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Categoria de pessoas inválida: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Utilizadores auto-categorizados com %1$s - página %2$d"
msgid "Disabled"
msgstr "Desabilitado"
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Esta operação só aceita pedidos POST."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Não pode apagar utilizadores."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Página não foi encontrada."
msgstr "Habilitado"
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Plugins"
msgid "Default plugins"
msgstr "Plugins padrão"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Conteúdo da nota é inválido."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"A licença ‘%1$s’ da nota não é compatível com a licença ‘%2$s’ do site."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Categoria inválida: \"%s\""
msgid "Restore account"
msgstr "Criar uma conta"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Além do limite de página (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Não foi possível importar as notas públicas."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Notas públicas, página %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Notas públicas"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Fonte de Notas Públicas (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Fonte de Notas Públicas (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Fonte de Notas Públicas (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Estas são as notas públicas do site %%site.name%% mas ninguém publicou nada "
"ainda."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Seja a primeira pessoa a publicar!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Podia [registar uma conta](%%action.register%%) e ser a primeira pessoa a "
"publicar!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"[StatusNet](http://status.net/). [Registe-se agora](%%action.register%%) "
"para partilhar notas sobre si, família e amigos! ([Saber mais](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Grupo %1$s, página %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Anotação"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Nomes alternativos"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Acções do grupo"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Avatar actualizado."
+#, fuzzy
+msgid "Notice"
+msgstr "Notas"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Categoria %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Perfil"
msgid "Tag user"
msgstr "Categorizar utilizador"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Categorias para este utilizador (letras, números, ., _), separadas por "
"vírgulas ou espaços"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Categoria inválida: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr "Só pode categorizar pessoas que subscreve ou os seus subscritores."
"Juntamente com este programa deve ter recebido uma cópia da GNU Affero "
"General Public License. Se não a tiver recebido, consulte %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Plugins"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Nome"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Acções do utilizador"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "A apagar o utilizador..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Editar configurações do perfil"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Editar"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Enviar mensagem directa a este utilizador"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Mensagem"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderar"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Função"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Gestor"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderador"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Não foi possível apagar a configuração do estilo."
+msgid "Home"
+msgstr "Página pessoal"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Configuração básica do site"
msgstr[0] "Está no grupo:"
msgstr[1] "Está nos grupos:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Comandos:\n"
-"on - ligar notificações\n"
-"off - desligar notificações\n"
-"help - mostrar esta ajuda\n"
-"follow <utilizador> - subscrever este utilizador\n"
-"groups - lista os grupos a que se juntou\n"
-"subscriptions - lista as pessoas que está a seguir\n"
-"subscribers - lista as pessoas que estão a segui-lo(a)\n"
-"leave <utilizador> - deixar de subscrever este utilizador\n"
-"d <utilizador> <texto> - mensagem directa para o utilizador\n"
-"get <utilizador> - receber última nota do utilizador\n"
-"whois <utilizador> - receber perfil do utilizador\n"
-"lose <utilizador> - obrigar o utilizador a deixar de subscrevê-lo\n"
-"fav <utilizador> - adicionar última nota do utilizador às favoritas\n"
-"fav #<id_da_nota> - adicionar nota com esta identificação às favoritas\n"
-"repeat #<id_da_nota> - repetir uma nota com uma certa identificação\n"
-"repeat <utilizador> - repetir a última nota do utilizador\n"
-"reply #<id_da_nota> - responder à nota com esta identificação\n"
-"reply <utilizador> - responder à última nota do utilizador\n"
-"join <grupo> - juntar-se ao grupo\n"
-"login - Receber uma ligação para iniciar sessão na interface web\n"
-"drop <grupo> - afastar-se do grupo\n"
-"stats - receber as suas estatísticas\n"
-"stop - o mesmo que 'off'\n"
-"quit - o mesmo que 'off'\n"
-"sub <utilizador> - o mesmo que 'follow'\n"
-"unsub <utilizador> - o mesmo que 'leave'\n"
-"last <utilizador> - o mesmo que 'get'\n"
-"on <utilizador> - ainda não implementado.\n"
-"off <utilizador> - ainda não implementado.\n"
-"nudge <utilizador> - relembrar um utilizador para actualizar.\n"
-"invite <número de telefone> - ainda não implementado.\n"
-"track <palavra> - ainda não implementado.\n"
-"untrack <palavra> - ainda não implementado.\n"
-"track off - ainda não implementado.\n"
-"untrack all - ainda não implementado.\n"
-"tracks - ainda não implementado.\n"
-"tracking - ainda não implementado.\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Resultados do comando"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Não foi possível ligar a notificação."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Não foi possível desligar a notificação."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Subscrever este utilizador"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Deixar de subscrever este utilizador"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Mensagens directas para %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Informação do perfil"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Repetir esta nota"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Responder a esta nota"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Grupo desconhecido."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Apagar grupo"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Comando ainda não implementado."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
#, fuzzy
msgid "Database error"
msgstr "Erro de base de dados"
-msgid "Home"
-msgstr "Página pessoal"
-
msgid "Public"
msgstr "Público"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "Localidade do grupo, se aplicável, por ex. \"Cidade, Região, País\""
+msgid "Aliases"
+msgstr "Nomes alternativos"
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Adicionar ou editar o design de %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Acções do grupo"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Grupos com mais membros"
msgid "Notice repeated"
msgstr "Nota repetida"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Tocar este utilizador"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Utilizador não tem perfil."
-msgid "Edit Avatar"
-msgstr "Editar Avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Acções do utilizador"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "A apagar o utilizador..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Editar configurações do perfil"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Editar"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Enviar mensagem directa a este utilizador"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Mensagem"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderar"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Função"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Gestor"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderador"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Não iniciou sessão."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "Notas de %s"
-
-#~ msgid "Everyone on this site"
-#~ msgstr "Todos neste site"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Categoria inválida: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:29+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:17+0000\n"
"Language-Team: Brazilian Portuguese <http://translatewiki.net/wiki/Portal:pt-"
"br>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: pt-br\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Grupos de %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Grupos de %1$s nos quais %2$s é membro."
msgstr "Só é possível tornar favoritas as mensagens."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+#, fuzzy
+msgid "Unknown notice."
msgstr "Mensagem desconhecida."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Não foi possível criar a aplicação."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Tamanho inválido."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Novo grupo"
"Essa é a sua caixa de mensagens enviadas, que lista as mensagens "
"particulares que você enviou."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Alterar a senha"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Altere a sua senha"
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Alterar a senha"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Senha anterior"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Senha nova"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "No mínimo 6 caracteres"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Confirmar"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Igual à senha acima"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Alterar"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "A senha deve ter, no mínimo, 6 caracteres."
msgid "Passwords don't match."
msgstr "As senhas não coincidem."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "A senha anterior está errada"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Erro ao salvar usuário; inválido."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Não é possível salvar a nova senha."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "A senha foi salva."
msgid "Server"
msgstr "Servidor"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Nome de host do servidor do site."
msgid "Path"
msgstr "Caminho"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Caminho do site."
msgid "Locale directory"
msgstr "Diretório dos locales"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Caminho do diretório de locales"
msgid "Fancy URLs"
msgstr "URLs limpas"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Utilizar URLs limpas (mais legíveis e memorizáveis)?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Tema"
msgstr "Diretório onde os anexos estão localizados."
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Procurar pessoas"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Não é uma etiqueta de pessoa válida: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Usuários auto-etiquetados com %1$s - pág. %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Esta ação aceita somente requisições POST."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Você não pode excluir usuários."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Esta página não existe."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Plugins"
msgid "Default plugins"
msgstr "Idioma padrão"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "O conteúdo da mensagem é inválido."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
"A licença ‘%1$s’ da mensagem não é compatível com a licença ‘%2$s’ do site."
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Etiqueta inválida: \"%s\""
msgid "Restore account"
msgstr "Criar uma conta"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Além do limite da página (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Não foi possível recuperar o fluxo público."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Mensagens públicas, pág. %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Mensagens públicas"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Fonte de mensagens públicas (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Fonte de mensagens públicas (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Fonte de mensagens públicas (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Esse é o fluxo de mensagens públicas de %%site.name%%, mas ninguém publicou "
"nada ainda."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Seja o primeiro a publicar!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Por que você não [registra uma conta](%%action.register%%) pra ser o "
"primeiro a publicar?"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"[Cadastre-se agora](%%action.register%%) para compartilhar notícias sobre "
"você com seus amigos, família e colegas! ([Saiba mais](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Grupo %1$s, pág. %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Mensagem"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Apelidos"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Ações do grupo"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "A mensagem excluída."
+msgid "Notice"
+msgstr "Mensagens"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Etiqueta %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Perfil do usuário"
msgid "Tag user"
msgstr "Etiquetar o usuário"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Etiquetas para este usuário (letras, números, -, ., e _), separadas por "
"vírgulas ou espaços"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Etiqueta inválida: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr "Você só pode etiquetar pessoas às quais assina ou que assinam você."
"Você deve ter recebido uma cópia da GNU Affero General Public License com "
"este programa. Caso contrário, veja %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Plugins"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Nome"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Ações do usuário"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Exclusão do usuário em andamento..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Editar as configurações do perfil"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Editar"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Enviar uma mensagem para este usuário."
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Mensagem"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderar"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Papel do usuário"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administrador"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderador"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Não foi possível excluir as configurações da aparência."
+msgid "Home"
+msgstr "Site"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Configuração básica do site"
msgstr[0] "Você é membro deste grupo:"
msgstr[1] "Você é membro destes grupos:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Comandos:\n"
-"on - ativa as notificações\n"
-"off - desativa as notificações\n"
-"help - exibe esta ajuda\n"
-"follow <identificação> - assina o usuário\n"
-"groups - lista os grupos aos quais você se associou\n"
-"subscriptions - lista as pessoas que você segue\n"
-"subscribers - lista as pessoas que seguem você\n"
-"leave <identificação> - deixa de assinar o usuário\n"
-"d <identificação> <texto> - mensagem direta para o usuário\n"
-"get <identificação> - obtém a última mensagem do usuário\n"
-"whois <identificação> - obtém as informações do perfil do usuário\n"
-"lose <identificação> - obriga o usuário a deixar de segui-lo\n"
-"fav <identificação> - adiciona a último mensagem do usuário como uma "
-"'favorita'\n"
-"fav #<id_da_mensagem> - adiciona a mensagem identificada como 'favorita'\n"
-"repeat #<id_da_mensagem> - repete a mensagem identificada\n"
-"repeat <identificação> - repete a última mensagem do usuário\n"
-"reply #<id_da_mensagem> - responde a mensagem identificada\n"
-"reply <identificação> - responde a última mensagem do usuário\n"
-"join <grupo> - associa-se ao grupo\n"
-"login - obtém um link para se autenticar na interface web\n"
-"drop <grupo> - deixa o grupo\n"
-"stats - obtém suas estatísticas\n"
-"stop - o mesmo que 'off'\n"
-"quit - o mesmo que 'off'\n"
-"sub <identificação> - o mesmo que 'follow'\n"
-"unsub <identificação> - o mesmo que 'leave'\n"
-"last <identificação> - o mesmo que 'get'\n"
-"on <identificação> - não implementado ainda\n"
-"off <identificação> - não implementado ainda\n"
-"nudge <identificação> - chama a atenção do usuário\n"
-"invite <número_de_ telefone> - não implementado ainda\n"
-"track <palavra> - não implementado ainda\n"
-"untrack <palavra> - não implementado ainda\n"
-"track off - não implementado ainda\n"
-"untrack all - não implementado ainda\n"
-"tracks - não implementado ainda\n"
-"tracking - não implementado ainda\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Resultados do comando"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Não é possível ligar a notificação."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Não é possível desligar a notificação."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Assinar este usuário"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Cancelar a assinatura deste usuário"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Mensagens diretas para %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Informações do perfil"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Repetir esta mensagem"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Responder a esta mensagem"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Grupo desconhecido."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Excluir o grupo"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "O comando não foi implementado ainda."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
#, fuzzy
msgid "Database error"
msgstr "Erro no banco de dados"
-msgid "Home"
-msgstr "Site"
-
msgid "Public"
msgstr "Público"
"Localização do grupo, caso tenha alguma, como \"cidade, estado (ou região), "
"país\""
+msgid "Aliases"
+msgstr "Apelidos"
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Adicionar ou editar a aparência de %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Ações do grupo"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Grupos com mais membros"
msgid "Notice repeated"
msgstr "Mensagem repetida"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Chamar a atenção deste usuário"
msgid "User %1$s (%2$d) has no profile record."
msgstr "O usuário não tem perfil."
-msgid "Edit Avatar"
-msgstr "Editar o avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Ações do usuário"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Exclusão do usuário em andamento..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Editar as configurações do perfil"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Editar"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Enviar uma mensagem para este usuário."
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Mensagem"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderar"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Papel do usuário"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administrador"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderador"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Você não está autenticado."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "Mensagens de %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Encontre pessoas neste site"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Etiqueta inválida: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:30+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:18+0000\n"
"Language-Team: Russian <http://translatewiki.net/wiki/Portal:ru>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ru\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Группы %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Группы %1$s, в которых состоит %2$s."
msgstr "Возможно только добавление записей в число любимых."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+#, fuzzy
+msgid "Unknown notice."
msgstr "Неизвестная запись"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
msgstr "Нет такой группы."
#. TRANS: Client exception thrown when trying to show membership of a non-subscribed group
-#, fuzzy
msgid "Not a member."
-msgstr "Ð\92Ñ\81е Ñ\83Ñ\87аÑ\81Ñ\82ники"
+msgstr "Ð\9dе Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\83Ñ\87аÑ\81Ñ\82ником."
#. TRANS: Client exception thrown when deleting someone else's membership.
-#, fuzzy
msgid "Cannot delete someone else's membership."
-msgstr "Невозможно удалить подписку на самого себя."
+msgstr "Не удаётся удалить членство другого пользователя."
#. TRANS: Client exception thrown when trying to display a subscription for a non-existing profile ID.
#. TRANS: %d is the non-existing profile ID number.
-#, fuzzy, php-format
+#, php-format
msgid "No such profile id: %d."
-msgstr "Нет такого профиля."
+msgstr "Нет такого профиля: %d."
#. TRANS: Client exception thrown when trying to display a subscription for a non-subscribed profile ID.
#. TRANS: %1$d is the non-existing subscriber ID number, $2$d is the ID of the profile that was not subscribed to.
-#, fuzzy, php-format
+#, php-format
msgid "Profile %1$d not subscribed to profile %2$d."
-msgstr "Ð\92Ñ\8b не подпиÑ\81анÑ\8b на Ñ\8dÑ\82оÑ\82 пÑ\80оÑ\84илÑ\8c."
+msgstr "Ð\9fÑ\80оÑ\84илÑ\8c %1$d не подпиÑ\81ан на пÑ\80оÑ\84илÑ\8c %2$d."
#. TRANS: Client exception thrown when trying to delete a subscription of another user.
-#, fuzzy
msgid "Cannot delete someone else's subscription."
-msgstr "Невозможно удалить подписку на самого себя."
+msgstr "Невозможно удалить подписку у другого пользователя."
#. TRANS: Subtitle for Atom subscription feed.
#. TRANS: %1$s is a user nickname, %s$s is the StatusNet sitename.
-#, fuzzy, php-format
+#, php-format
msgid "People %1$s has subscribed to on %2$s"
-msgstr "Люди подписанные на %s"
+msgstr "%1$s подписаны на %2$s"
#. TRANS: Client error displayed when not using the follow verb.
-#, fuzzy
msgid "Can only handle Follow activities."
-msgstr "Возможна обработка только POST-запросов."
+msgstr "Возможна обработка только Follow-запросов."
#. TRANS: Client exception thrown when subscribing to an object that is not a person.
msgid "Can only follow people."
#. TRANS: Client exception thrown when subscribing to a non-existing profile.
#. TRANS: %s is the unknown profile ID.
-#, fuzzy, php-format
+#, php-format
msgid "Unknown profile %s."
-msgstr "Ð\9dеподдеÑ\80живаемÑ\8bй Ñ\82ип Ñ\84айла"
+msgstr "Ð\9dеизвеÑ\81Ñ\82нÑ\8bй пÑ\80оÑ\84илÑ\8c %s."
#. TRANS: Client error displayed trying to subscribe to an already subscribed profile.
#. TRANS: %s is the profile the user already has a subscription on.
-#, fuzzy, php-format
+#, php-format
msgid "Already subscribed to %s."
-msgstr "Уже подпиÑ\81анÑ\8b!"
+msgstr "Ð\9fодпиÑ\81ка на %s Ñ\83же Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82."
#. TRANS: Client error displayed trying to get a non-existing attachment.
msgid "No such attachment."
msgstr "Файл не загружен."
#. TRANS: Avatar upload form instruction after uploading a file.
-#, fuzzy
msgid "Pick a square area of the image to be your avatar."
-msgstr "Ð\9fодбеÑ\80иÑ\82е нÑ\83жнÑ\8bй квадÑ\80аÑ\82нÑ\8bй Ñ\83Ñ\87аÑ\81Ñ\82ок длÑ\8f ваÑ\88ей аваÑ\82аÑ\80Ñ\8b"
+msgstr "Ð\9eÑ\82меÑ\82Ñ\8cÑ\82е квадÑ\80аÑ\82нÑ\8bй Ñ\83Ñ\87аÑ\81Ñ\82ок на изобÑ\80ажении длÑ\8f ваÑ\88ей аваÑ\82аÑ\80Ñ\8b."
#. TRANS: Server error displayed if an avatar upload went wrong somehow server side.
#. TRANS: Server error displayed trying to crop an uploaded group logo that is no longer present.
msgstr "Резервное копирование учетной записи"
#. TRANS: Client exception thrown when trying to backup an account while not logged in.
-#, fuzzy
msgid "Only logged-in users can backup their account."
-msgstr "Повторять записи могут только вошедшие пользователи."
+msgstr ""
+"Создавать резервную копию своей учётной записи могут только вошедшие "
+"пользователи."
#. TRANS: Client exception thrown when trying to backup an account without having backup rights.
msgid "You may not backup your account."
-msgstr ""
+msgstr "В не можете создавать резервную копию своей учётной записи."
#. TRANS: Information displayed on the backup account page.
msgid ""
"addresses is not backed up. Additionally, uploaded files and direct messages "
"are not backed up."
msgstr ""
+"Вы можете создать резервную копию данных вышей учётной записи в формате <a "
+"href=\"http://activitystrea.ms/\">Activity Streams</a>. Эта возможность "
+"является экспериментальной и результат копирования не будет полным; личные "
+"данные, такие как email или IM-адрес не войдут в резервную копию. К тому же, "
+"прикрепленные к вашим сообщениям файлы и прямые сообщения также не войдут в "
+"резервную копию."
#. TRANS: Submit button to backup an account on the backup account page.
-#, fuzzy
msgctxt "BUTTON"
msgid "Backup"
msgstr "Создать резервную копию"
#. TRANS: Title for submit button to backup an account on the backup account page.
-#, fuzzy
msgid "Backup your account."
-msgstr "РезеÑ\80вное копиÑ\80ование Ñ\83Ñ\87еÑ\82ной запиÑ\81и"
+msgstr "СоздаÑ\82Ñ\8c Ñ\80езеÑ\80внÑ\83Ñ\8e копиÑ\8e ваÑ\88ей Ñ\83Ñ\87Ñ\91Ñ\82ной запиÑ\81и."
#. TRANS: Client error displayed when blocking a user that has already been blocked.
msgid "You already blocked that user."
msgstr "Нет"
#. TRANS: Submit button title for 'No' when blocking a user.
-#, fuzzy
msgid "Do not block this user."
-msgstr "Не блокировать этого пользователя"
+msgstr "Не блокировать этого пользователя."
#. TRANS: Button label on the user block form.
#. TRANS: Button label on the delete application form.
msgstr "Да"
#. TRANS: Submit button title for 'Yes' when blocking a user.
-#, fuzzy
msgid "Block this user."
-msgstr "Заблокировать пользователя."
+msgstr "Заблокировать этого пользователя."
#. TRANS: Server error displayed when blocking a user fails.
msgid "Failed to save block information."
msgid "Couldn't update user."
msgstr "Не удаётся обновить пользователя."
-#, fuzzy
msgid "Couldn't update user im preferences."
-msgstr "Ð\9dе Ñ\83даÑ\91Ñ\82Ñ\81Ñ\8f обновиÑ\82Ñ\8c полÑ\8cзоваÑ\82елÑ\8cÑ\81кÑ\83Ñ\8e запиÑ\81Ñ\8c."
+msgstr "Ð\9dе Ñ\83даÑ\91Ñ\82Ñ\81Ñ\8f обновиÑ\82Ñ\8c наÑ\81Ñ\82Ñ\80ойки Ñ\81еÑ\80виÑ\81а мгновеннÑ\8bÑ\85 Ñ\81ообÑ\89ений."
-#, fuzzy
msgid "Couldn't insert user im preferences."
-msgstr "Не удаётся вставить новую подписку."
+msgstr ""
+"Не удаётся поместить настройки сервиса мгновенных сообщений в базу данных."
#. TRANS: Server error displayed when an address confirmation code deletion from the
#. TRANS: database fails in the contact address confirmation action.
msgstr "Записи"
#. TRANS: Client exception displayed trying to delete a user account while not logged in.
-#, fuzzy
msgid "Only logged-in users can delete their account."
-msgstr "Повторять записи могут только вошедшие пользователи."
+msgstr ""
+"Только пользователи, находящиеся в системе, могут удалить свою учётную "
+"запись."
#. TRANS: Client exception displayed trying to delete a user account without have the rights to do that.
-#, fuzzy
msgid "You cannot delete your account."
-msgstr "Вы не можете удалять пользователей."
+msgstr "Вы не можете удалить свою учётную запись."
#. TRANS: Confirmation text for user deletion. The user has to type this exactly the same, including punctuation.
msgid "I am sure."
#. TRANS: %s is the text that needs to be input.
#, php-format
msgid "You must write \"%s\" exactly in the box."
-msgstr ""
+msgstr "Вы должны написать «%s» прямо в этом поле."
#. TRANS: Confirmation that a user account has been deleted.
-#, fuzzy
msgid "Account deleted."
-msgstr "Ð\90ваÑ\82аÑ\80 Ñ\83далÑ\91н."
+msgstr "УÑ\87Ñ\91Ñ\82наÑ\8f запиÑ\81Ñ\8c Ñ\83далена."
#. TRANS: Page title for page on which a user account can be deleted.
#. TRANS: Option in profile settings to delete the account of the currently logged in user.
-#, fuzzy
msgid "Delete account"
-msgstr "СоздаÑ\82Ñ\8c новÑ\8bй аккаÑ\83нÑ\82"
+msgstr "Удаление Ñ\83Ñ\87Ñ\91Ñ\82ной запиÑ\81и"
#. TRANS: Form text for user deletion form.
msgid ""
"This will <strong>permanently delete</strong> your account data from this "
"server."
msgstr ""
+"Это действие приведёт <strong>удалению</strong> всех данных вашей учётной "
+"записи с этого сервера <strong>без возможности восстановления</strong>."
#. TRANS: Additional form text for user deletion form shown if a user has account backup rights.
#. TRANS: %s is a URL to the backup page.
"You are strongly advised to <a href=\"%s\">back up your data</a> before "
"deletion."
msgstr ""
+"Настоятельно советуем вам <a href=\"%s\">сделать резервную копию</a> данных "
+"вашей учётной записи, прежде чем удалять её с сервера."
#. TRANS: Field label for delete account confirmation entry.
#. TRANS: Field label for password reset form where the password has to be typed again.
#. TRANS: Input title for the delete account field.
#. TRANS: %s is the text that needs to be input.
-#, fuzzy, php-format
+#, php-format
msgid "Enter \"%s\" to confirm that you want to delete your account."
-msgstr "Вы не можете удалять пользователей."
+msgstr ""
+"Введите «%s» для подтверждения своего согласия на удаление учётной записи."
#. TRANS: Button title for user account deletion.
-#, fuzzy
msgid "Permanently delete your account"
-msgstr "Ð\92Ñ\8b не можеÑ\82е Ñ\83далÑ\8fÑ\82Ñ\8c полÑ\8cзоваÑ\82елей."
+msgstr "Ð\9dавÑ\81егда Ñ\83далиÑ\82Ñ\8c Ñ\83Ñ\87Ñ\91Ñ\82нÑ\83Ñ\8e запиÑ\81Ñ\8c"
#. TRANS: Client error displayed trying to delete an application while not logged in.
msgid "You must be logged in to delete an application."
"пользователей."
#. TRANS: Submit button title for 'No' when deleting an application.
-#, fuzzy
msgid "Do not delete this application."
-msgstr "Не удаляйте это приложение"
+msgstr "Не удалять это приложение."
#. TRANS: Submit button title for 'Yes' when deleting an application.
-#, fuzzy
msgid "Delete this application."
-msgstr "Удалить это приложение"
+msgstr "Удалить это приложение."
#. TRANS: Client error when trying to delete group while not logged in.
msgid "You must be logged in to delete a group."
"записи в этой группе по прежнему останутся в личных лентах."
#. TRANS: Submit button title for 'No' when deleting a group.
-#, fuzzy
msgid "Do not delete this group."
-msgstr "Не удаляйте эту группу"
+msgstr "Не удалять эту группу."
#. TRANS: Submit button title for 'Yes' when deleting a group.
-#, fuzzy
msgid "Delete this group."
-msgstr "Удалить эту группу"
+msgstr "Удалить эту группу."
#. TRANS: Error message displayed trying to delete a notice while not logged in.
#. TRANS: Client error displayed when trying to remove a favorite while not logged in.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgstr "Вы уверены, что хотите удалить эту запись?"
#. TRANS: Submit button title for 'No' when deleting a notice.
-#, fuzzy
msgid "Do not delete this notice."
-msgstr "Не удалять эту запись"
+msgstr "Не удалять эту запись."
#. TRANS: Submit button title for 'Yes' when deleting a notice.
-#, fuzzy
msgid "Delete this notice."
-msgstr "Удалить эту запись"
+msgstr "Удалить эту запись."
#. TRANS: Client error displayed when trying to delete a user without having the right to delete users.
msgid "You cannot delete users."
msgstr "Вы можете удалять только внутренних пользователей."
#. TRANS: Title of delete user page.
-#, fuzzy
msgctxt "TITLE"
msgid "Delete user"
-msgstr "УдалиÑ\82Ñ\8c пользователя"
+msgstr "Удаление пользователя"
#. TRANS: Fieldset legend on delete user page.
msgid "Delete user"
"всех данных о пользователе из базы данных без возможности восстановления."
#. TRANS: Submit button title for 'No' when deleting a user.
-#, fuzzy
msgid "Do not delete this user."
-msgstr "Не удаляйте эту группу"
+msgstr "Не удалять этого пользователя."
#. TRANS: Submit button title for 'Yes' when deleting a user.
-#, fuzzy
msgid "Delete this user."
-msgstr "Удалить этого пользователя"
+msgstr "Удалить этого пользователя."
#. TRANS: Message used as title for design settings for the site.
msgid "Design"
msgstr "Растянуть фоновое изображение"
#. TRANS: Fieldset legend for theme colors.
-#, fuzzy
msgid "Change colors"
-msgstr "Ð\98зменение Ñ\86веÑ\82овой гаммÑ\8b"
+msgstr "Ð\98зменение Ñ\86веÑ\82а"
#. TRANS: Field label for content color selector.
#. TRANS: Label on profile design page for setting a profile page content colour.
msgstr "Особый CSS"
#. TRANS: Button text for resetting theme settings.
-#, fuzzy
msgctxt "BUTTON"
msgid "Use defaults"
msgstr "Использовать значения по умолчанию"
#. TRANS: Title for button for resetting theme settings.
-#, fuzzy
msgid "Restore default designs."
-msgstr "Восстановить оформление по умолчанию"
+msgstr "Восстановить оформление по умолчанию."
#. TRANS: Title for button for resetting theme settings.
-#, fuzzy
msgid "Reset back to default."
-msgstr "Восстановить значения по умолчанию"
+msgstr "Восстановить значения по умолчанию."
#. TRANS: Title for button for saving theme settings.
-#, fuzzy
msgid "Save design."
-msgstr "Сохранить оформление"
+msgstr "Сохранить оформление."
#. TRANS: Client error displayed when trying to remove favorite status for a notice that is not a favorite.
msgid "This notice is not a favorite!"
#. TRANS: Client exception thrown when requesting a document from the documentation that does not exist.
#. TRANS: %s is the non-existing document.
-#, fuzzy, php-format
+#, php-format
msgid "No such document \"%s\"."
-msgstr "Нет такого документа «%s»"
+msgstr "Нет такого документа «%s»."
#. TRANS: Title for "Edit application" form.
#. TRANS: Form legend.
"To send notices via email, we need to create a unique email address for you "
"on this server:"
msgstr ""
+"Для отправки сообщений по электронной почте мы должны создать для вас "
+"уникальный email-адрес на этом сервере:"
#. TRANS: Button label for adding an e-mail address to send notices from.
#. TRANS: Button label for adding an SMS e-mail address to send notices from.
#. TRANS: e-mail addresses to which invitations were sent.
msgid "Invitation sent to the following person:"
msgid_plural "Invitations sent to the following people:"
-msgstr[0] "Ð\9fÑ\80иглаÑ\88ение оÑ\82пÑ\80авлено Ñ\81ледÑ\83Ñ\8eÑ\89емÑ\83 адÑ\80еÑ\81аÑ\82Ñ\83:"
-msgstr[1] "Ð\9fÑ\80иглаÑ\88ениÑ\8f оÑ\82пÑ\80авленÑ\8b Ñ\81ледÑ\83Ñ\8eÑ\89им адÑ\80еÑ\81аÑ\82ам:"
-msgstr[2] ""
+msgstr[0] "СпиÑ\81ок адÑ\80еÑ\81ов, на коÑ\82оÑ\80Ñ\8bе оÑ\82пÑ\80авленÑ\8b пÑ\80иглаÑ\88ениÑ\8f:"
+msgstr[1] "СпиÑ\81ок адÑ\80еÑ\81ов, на коÑ\82оÑ\80Ñ\8bе оÑ\82пÑ\80авленÑ\8b пÑ\80иглаÑ\88ениÑ\8f:"
+msgstr[2] "Список адресов, на которые отправлены приглашения:"
#. TRANS: Generic message displayed after sending out one or more invitations to
#. TRANS: people to join a StatusNet site.
msgid "Could not create application."
msgstr "Не удаётся создать приложение."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Неверный размер."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Новая группа"
"Это список исходящих писем, в котором перечислены отправленные вами личные "
"сообщения."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Изменение пароля"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Измените ваш пароль."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Пароль сохранён."
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Старый пароль"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Новый пароль"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 или больше знаков"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Подтверждение"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Тот же пароль, что и выше"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Изменить"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Пароль должен быть длиной не менее 6 символов."
msgid "Passwords don't match."
msgstr "Пароли не совпадают."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Некорректный старый пароль"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Ошибка сохранения пользователя; неверное имя."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Не удаётся сохранить новый пароль."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Пароль сохранён."
msgid "Server"
msgstr "Сервер"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Имя хоста сервера сайта."
msgid "Path"
msgstr "Путь"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Путь к сайту."
msgid "Locale directory"
msgstr "Директория локализации"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Путь к директории локализаций"
msgid "Fancy URLs"
msgstr "Короткие URL"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "Использовать ли короткие (более читаемые и запоминаемые) URL-адреса?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Тема"
msgstr "Директория, в которой расположены вложения."
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Поиск людей"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Неверный тег человека: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Пользователи, установившие себе тег %1$s — страница %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Это действие принимает только POST-запросы."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Вы не можете удалять пользователей."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Нет такой страницы."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Плагины"
msgid "Default plugins"
msgstr "Язык по умолчанию"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Ошибочное содержание записи."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "Лицензия записи «%1$s» не совместима с лицензией сайта «%2$s»."
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Неверный тег: «%s»"
msgid "Restore account"
msgstr "Создать новый аккаунт"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Превышен предел страницы (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Не удаётся вернуть публичный поток."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Общая лента, страница %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Общая лента"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Лента публичного потока (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Лента публичного потока (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Лента публичного потока (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr "Это общая лента %%site.name%%, однако пока никто ничего не отправил."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Создайте первую запись!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Почему бы не [зарегистрироваться](%%action.register%%), чтобы стать первым "
"отправителем?"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"register%%), чтобы держать в курсе своих событий поклонников, друзей, "
"родственников и коллег! ([Читать далее](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Группа %1$s, страница %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Запись"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Алиасы"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Действия группы"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Запись удалена."
+msgid "Notice"
+msgstr "Записи"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Теги %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Профиль пользователя"
msgid "Tag user"
msgstr "Теги для пользователя"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Теги для этого пользователя (буквы, цифры, -, ., и _), разделённые запятой "
"или пробелом"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Неверный тег: «%s»"
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Вы должны были получить копию GNU Affero General Public License вместе с "
"этой программой. Если нет, см. %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Плагины"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Имя"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Действия пользователя"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Идёт удаление пользователя…"
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Изменение настроек профиля"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Редактировать"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Послать приватное сообщение этому пользователю."
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Сообщение"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Модерировать"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Роль пользователя"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Администратор"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Модератор"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Не удаётся удалить настройки оформления."
+msgid "Home"
+msgstr "Главная"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Основная конфигурация сайта"
msgstr[1] "Вы являетесь участником следующих групп:"
msgstr[2] "Вы являетесь участником следующих групп:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Команды:\n"
-"on — включить уведомления\n"
-"off — отключить уведомления\n"
-"help — показать эту справку\n"
-"follow <nickname> — подписаться на пользователя\n"
-"groups — список групп, к которым вы присоединены\n"
-"subscriptions — список людей, за которыми вы следите\n"
-"subscribers — список людей, следящих на вами\n"
-"leave <nickname> — отписаться от пользователя\n"
-"d <nickname> <text> — прямое сообщение пользователю\n"
-"get <nickname> — получить последнюю запись от пользователя\n"
-"whois <nickname> — получить информацию из профиля пользователя\n"
-"lose <nickname> — отменить подписку пользователя на вас\n"
-"fav <nickname> — добавить последнюю запись пользователя в число любимых\n"
-"fav #<notice_id> — добавить запись с заданным id в число любимых\n"
-"repeat #<notice_id> — повторить уведомление с заданным id\n"
-"repeat <nickname> — повторить последнее уведомление от пользователя\n"
-"reply #<notice_id> — ответить на запись с заданным id\n"
-"reply <nickname> — ответить на последнюю запись пользователя\n"
-"join <group> — присоединиться к группе\n"
-"login — получить ссылку на вход в веб-интрефейсе\n"
-"drop <group> — покинуть группу\n"
-"stats — получить свою статистику\n"
-"stop — то же, что и 'off'\n"
-"quit — то же, что и 'off'\n"
-"sub <nickname> — то же, что и 'follow'\n"
-"unsub <nickname> — то же, что и 'leave'\n"
-"last <nickname> — то же, что и 'get'\n"
-"on <nickname> — пока не реализовано.\n"
-"off <nickname> — пока не реализовано.\n"
-"nudge <nickname> — напомнить пользователю обновиться.\n"
-"invite <phone number> — пока не реализовано.\n"
-"track <word> — пока не реализовано.\n"
-"untrack <word> — пока не реализовано.\n"
-"track off — пока не реализовано.\n"
-"untrack all — пока не реализовано.\n"
-"tracks — пока не реализовано.\n"
-"tracking — пока не реализовано.\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Команда исполнена"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Есть оповещение."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Нет оповещения."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Подписаться на этого пользователя"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Отписаться от этого пользователя"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Прямые сообщения для %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Информация профиля"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Повторить эту запись"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Ответить на эту запись"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Неизвестно"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Удалить группу"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Команда ещё не выполнена."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "No configuration file found."
msgid "Database error"
msgstr "Ошибка базы данных"
-msgid "Home"
-msgstr "Главная"
-
msgid "Public"
msgstr "Общее"
"Местонахождение группы, если есть, например «Город, область (или регион), "
"страна»."
+msgid "Aliases"
+msgstr "Алиасы"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Добавить или изменить оформление %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Действия группы"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Группы с наибольшим количеством участников"
msgid_plural "%dB"
msgstr[0] "%dБ"
msgstr[1] "%dБ"
-msgstr[2] ""
+msgstr[2] "%dБ"
#, php-format
msgid ""
msgid "Notice repeated"
msgstr "Запись повторена"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "«Подтолкнуть» этого пользователя"
msgid "User %1$s (%2$d) has no profile record."
msgstr "У пользователя %1$s (%2$d) нет записи профиля."
-msgid "Edit Avatar"
-msgstr "Изменить аватару"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Действия пользователя"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Идёт удаление пользователя…"
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Изменение настроек профиля"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Редактировать"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Послать приватное сообщение этому пользователю."
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Сообщение"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Модерировать"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Роль пользователя"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Администратор"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Модератор"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Не авторизован."
msgid "Getting backup from file '%s'."
msgstr "Получение резервной копии из файла «%s»."
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "Лента %s"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Найти человека на этом сайте"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Неверный тег: «%s»"
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
-#: actions/accessadminpanel.php:53 lib/adminpanelnav.php:92
+#: actions/accessadminpanel.php:53 lib/adminpanelnav.php:110
msgid "Access"
msgstr ""
#. TRANS: Button text on profile design page to save settings.
#: actions/accessadminpanel.php:193 actions/designadminpanel.php:732
#: actions/emailsettings.php:251 actions/imsettings.php:199
-#: actions/licenseadminpanel.php:335 actions/pathsadminpanel.php:512
+#: actions/licenseadminpanel.php:335 actions/pathsadminpanel.php:517
#: actions/profilesettings.php:198 actions/sitenoticeadminpanel.php:197
#: actions/smssettings.php:204 actions/subscriptions.php:261
-#: actions/urlsettings.php:152 actions/useradminpanel.php:298
-#: lib/applicationeditform.php:355 lib/designform.php:320
-#: lib/groupeditform.php:201
+#: actions/tagother.php:134 actions/urlsettings.php:152
+#: actions/useradminpanel.php:298 lib/applicationeditform.php:355
+#: lib/designform.php:320 lib/groupeditform.php:201
msgctxt "BUTTON"
msgid "Save"
msgstr ""
#. TRANS: Server error when page not found (404).
#. TRANS: Server error when page not found (404)
-#: actions/all.php:68 actions/public.php:98 actions/replies.php:93
+#: actions/all.php:68 actions/public.php:99 actions/replies.php:93
#: actions/showfavorites.php:140 actions/tag.php:52
msgid "No such page."
msgstr ""
#. TRANS: Timeline title for user and friends. %s is a user nickname.
#: actions/all.php:94 actions/all.php:185 actions/allrss.php:117
#: actions/apitimelinefriends.php:207 actions/apitimelinehome.php:113
-#: lib/personalgroupnav.php:72
+#: lib/adminpanelnav.php:70 lib/personalgroupnav.php:75 lib/settingsnav.php:71
#, php-format
msgid "%s and friends"
msgstr ""
#. TRANS: %s is a user nickname. This message contains Markdown links. Keep "](" together.
#. TRANS: Second sentence of empty message for anonymous users. %s is a user nickname.
#. TRANS: This message contains a Markdown link. Keep "](" together.
-#: actions/all.php:149 actions/replies.php:198 actions/showstream.php:221
+#: actions/all.php:149 actions/replies.php:198 actions/showstream.php:219
#, php-format
msgid ""
"Why not [register an account](%%%%action.register%%%%) and then nudge %s or "
msgid "%s's groups"
msgstr ""
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#: actions/apigrouplist.php:104
#, php-format
msgid "%1$s groups %2$s is a member of."
#: actions/invite.php:60 actions/makeadmin.php:67 actions/newmessage.php:140
#: actions/newnotice.php:104 actions/nudge.php:81
#: actions/oauthappssettings.php:162 actions/oauthconnectionssettings.php:135
-#: actions/passwordsettings.php:137 actions/pluginenable.php:87
-#: actions/profilesettings.php:218 actions/recoverpassword.php:383
+#: actions/passwordsettings.php:146 actions/pluginenable.php:87
+#: actions/profilesettings.php:218 actions/recoverpassword.php:387
#: actions/register.php:157 actions/remotesubscribe.php:76
#: actions/repeat.php:82 actions/smssettings.php:249 actions/subedit.php:40
-#: actions/subscribe.php:87 actions/tagother.php:145
+#: actions/subscribe.php:87 actions/tagother.php:146
#: actions/unsubscribe.php:69 actions/urlsettings.php:171
#: actions/userauthorization.php:53 lib/designsettings.php:122
msgid "There was a problem with your session token. Try again, please."
#. TRANS: Field label on OAuth API authorisation form.
#. TRANS: Field label on login page.
#: actions/apioauthauthorize.php:463 actions/login.php:235
-#: actions/register.php:415 lib/settingsnav.php:74
+#: actions/register.php:415 lib/settingsnav.php:93
msgid "Password"
msgstr ""
#. TRANS: Error message displayed trying to delete a non-existing notice.
#: actions/apistatusesretweet.php:74 actions/apistatusesretweets.php:70
#: actions/atompubshowfavorite.php:82 actions/deletenotice.php:61
-#: actions/shownotice.php:92
+#: actions/shownotice.php:95
msgid "No such notice."
msgstr ""
msgstr ""
#. TRANS: Client error displayed attempting to post an API that is not well-formed XML.
-#: actions/apitimelineuser.php:328
+#: actions/apitimelineuser.php:331
msgid "Atom post must be well-formed XML."
msgstr ""
#. TRANS: Client error displayed when not using an Atom entry.
-#: actions/apitimelineuser.php:334 actions/atompubfavoritefeed.php:228
+#: actions/apitimelineuser.php:337 actions/atompubfavoritefeed.php:228
#: actions/atompubmembershipfeed.php:230
#: actions/atompubsubscriptionfeed.php:236
msgid "Atom post must be an Atom entry."
msgstr ""
#. TRANS: Client error displayed when not using the POST verb. Do not translate POST.
-#: actions/apitimelineuser.php:345
+#: actions/apitimelineuser.php:348
msgid "Can only handle POST activities."
msgstr ""
#. TRANS: Client error displayed when using an unsupported activity object type.
#. TRANS: %s is the unsupported activity object type.
-#: actions/apitimelineuser.php:356
+#: actions/apitimelineuser.php:359
#, php-format
msgid "Cannot handle activity object type \"%s\"."
msgstr ""
#. TRANS: Client error displayed when posting a notice without content through the API.
#. TRANS: %d is the notice ID (number).
-#: actions/apitimelineuser.php:390
+#: actions/apitimelineuser.php:393
#, php-format
msgid "No content for notice %d."
msgstr ""
#. TRANS: Client error displayed when using another format than AtomPub.
#. TRANS: %s is the notice URI.
-#: actions/apitimelineuser.php:419
+#: actions/apitimelineuser.php:422
#, php-format
msgid "Notice with URI \"%s\" already exists."
msgstr ""
#. TRANS: Client exception thrown when trying favorite a notice without content.
#: actions/atompubfavoritefeed.php:259
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr ""
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
msgstr ""
#. TRANS: Title for avatar upload page.
-#: actions/avatarsettings.php:66 lib/settingsnav.php:69
+#: actions/avatarsettings.php:66 lib/settingsnav.php:88
msgid "Avatar"
msgstr ""
#. TRANS: Field label for delete account confirmation entry.
#. TRANS: Field label for password reset form where the password has to be typed again.
-#: actions/deleteaccount.php:300 actions/passwordsettings.php:112
-#: actions/recoverpassword.php:262 actions/register.php:419
+#: actions/deleteaccount.php:300 actions/recoverpassword.php:262
+#: actions/register.php:419
msgid "Confirm"
msgstr ""
#. TRANS: Client error text when there is a problem with the session token.
#: actions/deleteapplication.php:102 actions/editapplication.php:131
#: actions/newapplication.php:112 actions/showapplication.php:113
-#: lib/action.php:1388
+#: lib/action.php:1448
msgid "There was a problem with your session token."
msgstr ""
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
#: actions/deletenotice.php:52 actions/disfavor.php:61 actions/favor.php:62
#: actions/groupblock.php:60 actions/groupunblock.php:60 actions/logout.php:69
#: actions/makeadmin.php:62 actions/newmessage.php:89 actions/newnotice.php:87
-#: actions/nudge.php:64 actions/pluginenable.php:97 actions/subedit.php:33
-#: actions/subscribe.php:98 actions/tagother.php:33 actions/unsubscribe.php:52
+#: actions/nudge.php:64 actions/pluginenable.php:98 actions/subedit.php:33
+#: actions/subscribe.php:98 actions/tagother.php:34 actions/unsubscribe.php:52
#: lib/adminpanelaction.php:71 lib/profileformaction.php:63
#: lib/settingsaction.php:72
msgid "Not logged in."
msgstr ""
#. TRANS: Message used as title for design settings for the site.
-#: actions/designadminpanel.php:60 lib/settingsnav.php:84
+#: actions/designadminpanel.php:60 lib/settingsnav.php:103
msgid "Design"
msgstr ""
#. TRANS: Title for first page of favourite notices of a user.
#. TRANS: %s is the user for whom the favourite notices are displayed.
#: actions/favoritesrss.php:111 actions/showfavorites.php:76
-#: lib/personalgroupnav.php:88
+#: lib/personalgroupnav.php:91
#, php-format
msgid "%s's favorite notices"
msgstr ""
#. TRANS: Client error displayed trying a change a subscription for a non-existant profile ID.
#. TRANS: Client error displayed when trying to change user options without specifying an existing user to work on.
#: actions/groupblock.php:77 actions/groupunblock.php:77
-#: actions/makeadmin.php:79 actions/subedit.php:57 actions/tagother.php:46
+#: actions/makeadmin.php:79 actions/subedit.php:57 actions/tagother.php:47
#: actions/unsubscribe.php:84 lib/profileformaction.php:87
msgid "No profile with that ID."
msgstr ""
msgstr ""
#. TRANS: Indicator in group members list that this user is a group administrator.
-#: actions/groupmembers.php:190 lib/primarynav.php:63
+#: actions/groupmembers.php:190 lib/adminpanelnav.php:77 lib/primarynav.php:63
msgid "Admin"
msgstr ""
#. TRANS: Send button for inviting friends
#. TRANS: Button text for sending notice.
-#: actions/invite.php:232 lib/noticeform.php:254
+#: actions/invite.php:232 lib/noticeform.php:256
msgctxt "BUTTON"
msgid "Send"
msgstr ""
msgid "Could not create application."
msgstr ""
+#: actions/newapplication.php:297
+msgid "Invalid image."
+msgstr ""
+
#. TRANS: Title for form to create a group.
#: actions/newgroup.php:53
msgid "New group"
#. TRANS: Page title after an AJAX error occurred on the "send direct message" page.
#. TRANS: Page title after an AJAX error occurs on the send notice page.
-#: actions/newmessage.php:227 actions/newnotice.php:264
+#: actions/newmessage.php:227 actions/newnotice.php:264 lib/error.php:117
msgid "Ajax Error"
msgstr ""
msgstr ""
#. TRANS: Server error displayed in oEmbed action when notice has not profile.
-#: actions/oembed.php:85 actions/shownotice.php:100
+#: actions/oembed.php:85 actions/shownotice.php:103
msgid "Notice has no profile."
msgstr ""
#. TRANS: oEmbed title. %1$s is the author name, %2$s is the creation date.
-#: actions/oembed.php:89 actions/shownotice.php:172
+#: actions/oembed.php:89 actions/shownotice.php:175
#, php-format
msgid "%1$s's status on %2$s"
msgstr ""
msgid "This is your outbox, which lists private messages you have sent."
msgstr ""
-#: actions/passwordsettings.php:58
+#. TRANS: Title for page where to change password.
+#: actions/passwordsettings.php:59
+msgctxt "TITLE"
msgid "Change password"
msgstr ""
-#: actions/passwordsettings.php:69
+#. TRANS: Instructions for page where to change password.
+#: actions/passwordsettings.php:71
msgid "Change your password."
msgstr ""
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
-#: actions/passwordsettings.php:96 actions/recoverpassword.php:251
+#: actions/passwordsettings.php:99 actions/recoverpassword.php:251
msgid "Password change"
msgstr ""
-#: actions/passwordsettings.php:104
+#. TRANS: Field label on page where to change password.
+#: actions/passwordsettings.php:108
msgid "Old password"
msgstr ""
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
-#: actions/passwordsettings.php:108 actions/recoverpassword.php:256
+#: actions/passwordsettings.php:113 actions/recoverpassword.php:256
msgid "New password"
msgstr ""
-#: actions/passwordsettings.php:109 actions/register.php:416
+#. TRANS: Field title on page where to change password.
+#: actions/passwordsettings.php:115 actions/register.php:416
msgid "6 or more characters."
msgstr ""
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#: actions/passwordsettings.php:119
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr ""
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
-#: actions/passwordsettings.php:113 actions/recoverpassword.php:264
+#: actions/passwordsettings.php:121 actions/recoverpassword.php:264
#: actions/register.php:420
msgid "Same as password above."
msgstr ""
-#: actions/passwordsettings.php:117
+#. TRANS: Button text on page where to change password.
+#: actions/passwordsettings.php:126
+msgctxt "BUTTON"
msgid "Change"
msgstr ""
-#: actions/passwordsettings.php:153 actions/register.php:223
+#. TRANS: Form validation error on page where to change password.
+#: actions/passwordsettings.php:163 actions/register.php:223
msgid "Password must be 6 or more characters."
msgstr ""
-#: actions/passwordsettings.php:156 actions/register.php:226
+#: actions/passwordsettings.php:166 actions/register.php:226
msgid "Passwords don't match."
msgstr ""
-#: actions/passwordsettings.php:164
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#: actions/passwordsettings.php:175
+msgid "Incorrect old password."
msgstr ""
-#: actions/passwordsettings.php:180
+#. TRANS: Form validation error on page where to change password.
+#: actions/passwordsettings.php:192
msgid "Error saving user; invalid."
msgstr ""
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
-#: actions/passwordsettings.php:185 actions/recoverpassword.php:418
+#: actions/passwordsettings.php:199 actions/recoverpassword.php:422
msgid "Cannot save new password."
msgstr ""
-#: actions/passwordsettings.php:191
+#. TRANS: Form validation notice on page where to change password.
+#: actions/passwordsettings.php:206
msgid "Password saved."
msgstr ""
#. TRANS: Title for Paths admin panel.
#. TRANS: Menu item for site administration
-#: actions/pathsadminpanel.php:58 lib/adminpanelnav.php:100
+#: actions/pathsadminpanel.php:58 lib/adminpanelnav.php:118
msgid "Paths"
msgstr ""
msgstr ""
#. TRANS: Field label in Paths admin panel.
-#: actions/pathsadminpanel.php:241 actions/pathsadminpanel.php:279
-#: actions/pathsadminpanel.php:370 actions/pathsadminpanel.php:425
+#: actions/pathsadminpanel.php:241 actions/pathsadminpanel.php:284
+#: actions/pathsadminpanel.php:375 actions/pathsadminpanel.php:430
msgid "Server"
msgstr ""
-#: actions/pathsadminpanel.php:242
+#. TRANS: Field title in Paths admin panel.
+#: actions/pathsadminpanel.php:243
msgid "Site's server hostname."
msgstr ""
#. TRANS: Field label in Paths admin panel.
-#: actions/pathsadminpanel.php:248 actions/pathsadminpanel.php:288
-#: actions/pathsadminpanel.php:379 actions/pathsadminpanel.php:434
+#: actions/pathsadminpanel.php:249 actions/pathsadminpanel.php:293
+#: actions/pathsadminpanel.php:384 actions/pathsadminpanel.php:439
msgid "Path"
msgstr ""
-#: actions/pathsadminpanel.php:249
+#. TRANS: Field title in Paths admin panel.
+#: actions/pathsadminpanel.php:251
msgid "Site path."
msgstr ""
#. TRANS: Field label in Paths admin panel.
-#: actions/pathsadminpanel.php:255
+#: actions/pathsadminpanel.php:257
msgid "Locale directory"
msgstr ""
-#: actions/pathsadminpanel.php:256
+#. TRANS: Field title in Paths admin panel.
+#: actions/pathsadminpanel.php:259
msgid "Directory path to locales."
msgstr ""
#. TRANS: Checkbox label in Paths admin panel.
-#: actions/pathsadminpanel.php:263
+#: actions/pathsadminpanel.php:266
msgid "Fancy URLs"
msgstr ""
-#: actions/pathsadminpanel.php:265
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#: actions/pathsadminpanel.php:269
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
-#: actions/pathsadminpanel.php:272
+#. TRANS: Fieldset legend in Paths admin panel.
+#: actions/pathsadminpanel.php:277
+msgctxt "LEGEND"
msgid "Theme"
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:281
+#: actions/pathsadminpanel.php:286
msgid "Server for themes."
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:290
+#: actions/pathsadminpanel.php:295
msgid "Web path to themes."
msgstr ""
#. TRANS: Field label in Paths admin panel.
-#: actions/pathsadminpanel.php:297 actions/pathsadminpanel.php:388
-#: actions/pathsadminpanel.php:443 actions/pathsadminpanel.php:495
+#: actions/pathsadminpanel.php:302 actions/pathsadminpanel.php:393
+#: actions/pathsadminpanel.php:448 actions/pathsadminpanel.php:500
msgid "SSL server"
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:299
+#: actions/pathsadminpanel.php:304
msgid "SSL server for themes (default: SSL server)."
msgstr ""
#. TRANS: Field label in Paths admin panel.
-#: actions/pathsadminpanel.php:306 actions/pathsadminpanel.php:397
-#: actions/pathsadminpanel.php:452
+#: actions/pathsadminpanel.php:311 actions/pathsadminpanel.php:402
+#: actions/pathsadminpanel.php:457
msgid "SSL path"
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:308
+#: actions/pathsadminpanel.php:313
msgid "SSL path to themes (default: /theme/)."
msgstr ""
#. TRANS: Field label in Paths admin panel.
-#: actions/pathsadminpanel.php:315 actions/pathsadminpanel.php:406
-#: actions/pathsadminpanel.php:461
+#: actions/pathsadminpanel.php:320 actions/pathsadminpanel.php:411
+#: actions/pathsadminpanel.php:466
msgid "Directory"
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:317
+#: actions/pathsadminpanel.php:322
msgid "Directory where themes are located."
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
-#: actions/pathsadminpanel.php:326
+#: actions/pathsadminpanel.php:331
msgid "Avatars"
msgstr ""
#. TRANS: Field label in Paths admin panel.
-#: actions/pathsadminpanel.php:333
+#: actions/pathsadminpanel.php:338
msgid "Avatar server"
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:335
+#: actions/pathsadminpanel.php:340
msgid "Server for avatars."
msgstr ""
#. TRANS: Field label in Paths admin panel.
-#: actions/pathsadminpanel.php:342
+#: actions/pathsadminpanel.php:347
msgid "Avatar path"
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:344
+#: actions/pathsadminpanel.php:349
msgid "Web path to avatars."
msgstr ""
#. TRANS: Field label in Paths admin panel.
-#: actions/pathsadminpanel.php:351
+#: actions/pathsadminpanel.php:356
msgid "Avatar directory"
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:353
+#: actions/pathsadminpanel.php:358
msgid "Directory where avatars are located."
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
-#: actions/pathsadminpanel.php:364
+#: actions/pathsadminpanel.php:369
msgid "Backgrounds"
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:372
+#: actions/pathsadminpanel.php:377
msgid "Server for backgrounds."
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:381
+#: actions/pathsadminpanel.php:386
msgid "Web path to backgrounds."
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:390
+#: actions/pathsadminpanel.php:395
msgid "Server for backgrounds on SSL pages."
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:399
+#: actions/pathsadminpanel.php:404
msgid "Web path to backgrounds on SSL pages."
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:408
+#: actions/pathsadminpanel.php:413
msgid "Directory where backgrounds are located."
msgstr ""
#. TRANS: Fieldset legens in Paths admin panel.
-#: actions/pathsadminpanel.php:419
+#: actions/pathsadminpanel.php:424
msgid "Attachments"
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:427
+#: actions/pathsadminpanel.php:432
msgid "Server for attachments."
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:436
+#: actions/pathsadminpanel.php:441
msgid "Web path to attachments."
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:445
+#: actions/pathsadminpanel.php:450
msgid "Server for attachments on SSL pages."
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:454
+#: actions/pathsadminpanel.php:459
msgid "Web path to attachments on SSL pages."
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:463
+#: actions/pathsadminpanel.php:468
msgid "Directory where attachments are located."
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
-#: actions/pathsadminpanel.php:472
+#: actions/pathsadminpanel.php:477
+msgctxt "LEGEND"
msgid "SSL"
msgstr ""
#. TRANS: Drop down option in Paths admin panel (option for "When to use SSL").
-#: actions/pathsadminpanel.php:477 actions/snapshotadminpanel.php:202
+#: actions/pathsadminpanel.php:482 actions/snapshotadminpanel.php:202
msgid "Never"
msgstr ""
#. TRANS: Drop down option in Paths admin panel (option for "When to use SSL").
-#: actions/pathsadminpanel.php:479
+#: actions/pathsadminpanel.php:484
msgid "Sometimes"
msgstr ""
#. TRANS: Drop down option in Paths admin panel (option for "When to use SSL").
-#: actions/pathsadminpanel.php:481
+#: actions/pathsadminpanel.php:486
msgid "Always"
msgstr ""
-#: actions/pathsadminpanel.php:485
+#: actions/pathsadminpanel.php:490
msgid "Use SSL"
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:487
+#: actions/pathsadminpanel.php:492
msgid "When to use SSL."
msgstr ""
#. TRANS: Tooltip for field label in Paths admin panel.
-#: actions/pathsadminpanel.php:497
+#: actions/pathsadminpanel.php:502
msgid "Server to direct SSL requests to."
msgstr ""
#. TRANS: Button title text to store form data in the Paths admin panel.
-#: actions/pathsadminpanel.php:514
+#: actions/pathsadminpanel.php:519
msgid "Save paths"
msgstr ""
msgid "People search"
msgstr ""
-#: actions/peopletag.php:68
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
+#: actions/peopletag.php:69
#, php-format
msgid "Not a valid people tag: %s."
msgstr ""
-#: actions/peopletag.php:142
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
+#: actions/peopletag.php:145
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr ""
#. TRANS: Page title for AJAX form return when a disabling a plugin.
-#: actions/plugindisable.php:69
+#: actions/plugindisable.php:68
msgctxt "plugin"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
#: actions/pluginenable.php:78 actions/subscribe.php:77
msgid "This action only accepts POST requests."
msgstr ""
-#: actions/pluginenable.php:102
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
+#: actions/pluginenable.php:104
msgid "You cannot administer plugins."
msgstr ""
-#: actions/pluginenable.php:109
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
+#: actions/pluginenable.php:112
msgid "No such plugin."
msgstr ""
#. TRANS: Page title for AJAX form return when enabling a plugin.
-#: actions/pluginenable.php:159
+#: actions/pluginenable.php:161
msgctxt "plugin"
msgid "Enabled"
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
-#: actions/pluginsadminpanel.php:56 actions/version.php:191
-#: lib/adminpanelnav.php:140
+#: actions/pluginsadminpanel.php:53
+msgctxt "TITLE"
msgid "Plugins"
msgstr ""
#. TRANS: Instructions at top of plugin admin page.
-#: actions/pluginsadminpanel.php:68
+#: actions/pluginsadminpanel.php:64
msgid ""
"Additional plugins can be enabled and configured manually. See the <a href="
"\"http://status.net/wiki/Plugins\">online plugin documentation</a> for more "
msgstr ""
#. TRANS: Admin form section header
-#: actions/pluginsadminpanel.php:84
+#: actions/pluginsadminpanel.php:79
msgid "Default plugins"
msgstr ""
-#: actions/pluginsadminpanel.php:106
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
+#: actions/pluginsadminpanel.php:102
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
-#: actions/postnotice.php:95
+#. TRANS: Client error displayed if the notice posted has too many characters.
+#: actions/postnotice.php:96
msgid "Invalid notice content."
msgstr ""
-#: actions/postnotice.php:101
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#: actions/postnotice.php:104
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
#. TRANS: Page title for profile settings.
msgstr ""
#. TRANS: Field label in form for profile settings.
-#: actions/profilesettings.php:162 actions/tagother.php:128
-#: actions/tagother.php:188 lib/subscriptionlist.php:104
+#: actions/profilesettings.php:162 actions/tagother.php:129
+#: actions/tagother.php:191 lib/subscriptionlist.php:104
#: lib/subscriptionlist.php:106
msgid "Tags"
msgstr ""
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
-#: actions/profilesettings.php:292
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
+#: actions/profilesettings.php:292 actions/tagother.php:160
#, php-format
msgid "Invalid tag: \"%s\"."
msgstr ""
msgstr ""
#. TRANS: Server error thrown when user profile settings tags could not be saved.
-#: actions/profilesettings.php:428 actions/tagother.php:179
+#: actions/profilesettings.php:428 actions/tagother.php:182
msgid "Could not save tags."
msgstr ""
msgid "Restore account"
msgstr ""
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#: actions/public.php:83
#, php-format
msgid "Beyond the page limit (%s)."
msgstr ""
-#: actions/public.php:92
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
+#: actions/public.php:93
msgid "Could not retrieve public stream."
msgstr ""
-#: actions/public.php:130
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
+#: actions/public.php:131
#, php-format
msgid "Public timeline, page %d"
msgstr ""
-#: actions/public.php:132 lib/publicgroupnav.php:65
+#. TRANS: Title for the first public timeline page.
+#: actions/public.php:134 lib/publicgroupnav.php:65
msgid "Public timeline"
msgstr ""
-#: actions/public.php:160
+#. TRANS: Link description for public timeline feed.
+#: actions/public.php:162
msgid "Public Stream Feed (RSS 1.0)"
msgstr ""
-#: actions/public.php:164
+#. TRANS: Link description for public timeline feed.
+#: actions/public.php:167
msgid "Public Stream Feed (RSS 2.0)"
msgstr ""
-#: actions/public.php:168
+#. TRANS: Link description for public timeline feed.
+#: actions/public.php:172
msgid "Public Stream Feed (Atom)"
msgstr ""
-#: actions/public.php:173
+#. TRANS: Text displayed for public feed when there are no public notices.
+#: actions/public.php:178
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr ""
-#: actions/public.php:176
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
+#: actions/public.php:182
msgid "Be the first to post!"
msgstr ""
-#: actions/public.php:180
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
+#: actions/public.php:187
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
-#: actions/public.php:227
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
+#: actions/public.php:235
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"friends, family, and colleagues! ([Read more](%%doc.help%%))"
msgstr ""
-#: actions/public.php:232
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
+#: actions/public.php:242
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
#. TRANS: Title for password recovery page in email sent mode.
#. TRANS: Subject for password recovery e-mail.
-#: actions/recoverpassword.php:227 actions/recoverpassword.php:366
+#: actions/recoverpassword.php:227 actions/recoverpassword.php:370
msgid "Password recovery requested"
msgstr ""
msgstr ""
#. TRANS: Information on password recovery form if no known username or e-mail address was specified.
-#: actions/recoverpassword.php:309
+#: actions/recoverpassword.php:313
msgid "No user with that email address or username."
msgstr ""
#. TRANS: Client error displayed on password recovery form if a user does not have a registered e-mail address.
-#: actions/recoverpassword.php:327
+#: actions/recoverpassword.php:331
msgid "No registered email address for that user."
msgstr ""
#. TRANS: Server error displayed if e-mail address confirmation fails in the database on the password recovery form.
-#: actions/recoverpassword.php:342
+#: actions/recoverpassword.php:346
msgid "Error saving address confirmation."
msgstr ""
#. TRANS: User notification after an e-mail with instructions was sent from the password recovery form.
-#: actions/recoverpassword.php:370
+#: actions/recoverpassword.php:374
msgid ""
"Instructions for recovering your password have been sent to the email "
"address registered to your account."
msgstr ""
#. TRANS: Client error displayed when trying to reset as password without providing a user.
-#: actions/recoverpassword.php:391
+#: actions/recoverpassword.php:395
msgid "Unexpected password reset."
msgstr ""
#. TRANS: Reset password form validation error message.
-#: actions/recoverpassword.php:400
+#: actions/recoverpassword.php:404
msgid "Password must be 6 characters or more."
msgstr ""
#. TRANS: Reset password form validation error message.
-#: actions/recoverpassword.php:405
+#: actions/recoverpassword.php:409
msgid "Password and confirmation do not match."
msgstr ""
#. TRANS: Server error displayed when something does wrong with the user object during password reset.
-#: actions/recoverpassword.php:426 actions/register.php:241
+#: actions/recoverpassword.php:430 actions/register.php:241
msgid "Error setting user."
msgstr ""
#. TRANS: Success message for user after password reset.
-#: actions/recoverpassword.php:434
+#: actions/recoverpassword.php:438
msgid "New password successfully saved. You are now logged in."
msgstr ""
msgstr ""
#: actions/register.php:424 actions/register.php:428
-#: actions/siteadminpanel.php:238 lib/settingsnav.php:79
+#: actions/siteadminpanel.php:238 lib/settingsnav.php:98
msgid "Email"
msgstr ""
msgstr ""
#. TRANS: Link text for link that will subscribe to a remote profile.
-#: actions/remotesubscribe.php:136 lib/subscribeform.php:139
-#: lib/userprofile.php:406
+#: actions/remotesubscribe.php:136 lib/accountprofileblock.php:288
+#: lib/subscribeform.php:139
msgid "Subscribe"
msgstr ""
msgid "You already repeated that notice."
msgstr ""
-#: actions/repeat.php:112 lib/noticelist.php:697
+#: actions/repeat.php:112 lib/noticelistitem.php:602
msgid "Repeated"
msgstr ""
#. TRANS: RSS reply feed title. %s is a user nickname.
#: actions/replies.php:126 actions/repliesrss.php:68
-#: lib/personalgroupnav.php:83
+#: lib/personalgroupnav.php:86
#, php-format
msgid "Replies to %s"
msgstr ""
#. TRANS: Menu item for site administration
#: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
-#: lib/adminpanelnav.php:108
+#: lib/adminpanelnav.php:126
msgid "Sessions"
msgstr ""
#. TRANS: Submit button title.
#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292
-#: actions/snapshotadminpanel.php:245 actions/tagother.php:133
-#: lib/applicationeditform.php:357
+#: actions/snapshotadminpanel.php:245 lib/applicationeditform.php:357
msgid "Save"
msgstr ""
#. TRANS: Title of form for deleting a user.
#: actions/showapplication.php:228 lib/deletegroupform.php:121
-#: lib/deleteuserform.php:64 lib/noticelist.php:678
+#: lib/deleteuserform.php:64 lib/noticelistitem.php:583
msgid "Delete"
msgstr ""
msgid "%1$s group, page %2$d"
msgstr ""
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-#: actions/showgroup.php:266
-msgid "Note"
-msgstr ""
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-#: actions/showgroup.php:277 lib/groupeditform.php:180
-msgid "Aliases"
-msgstr ""
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-#: actions/showgroup.php:294
-msgid "Group actions"
-msgstr ""
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
-#: actions/showgroup.php:338
+#: actions/showgroup.php:221
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgstr ""
#. TRANS: Tooltip for feed link. %s is a group nickname.
-#: actions/showgroup.php:345
+#: actions/showgroup.php:228
#, php-format
msgid "Notice feed for %s group (RSS 2.0)"
msgstr ""
#. TRANS: Tooltip for feed link. %s is a group nickname.
-#: actions/showgroup.php:352
+#: actions/showgroup.php:235
#, php-format
msgid "Notice feed for %s group (Atom)"
msgstr ""
#. TRANS: Tooltip for feed link. %s is a group nickname.
-#: actions/showgroup.php:358
+#: actions/showgroup.php:241
#, php-format
msgid "FOAF for %s group"
msgstr ""
#. TRANS: Header for mini list of group members on a group page (h2).
-#: actions/showgroup.php:395
+#: actions/showgroup.php:278
msgid "Members"
msgstr ""
#. TRANS: Text for user subscription statistics if the user has no subscriptions.
#. TRANS: Text for user subscriber statistics if user has no subscribers.
#. TRANS: Text for user user group membership statistics if user is not a member of any group.
-#: actions/showgroup.php:401 lib/profileaction.php:137
+#: actions/showgroup.php:284 lib/profileaction.php:137
#: lib/profileaction.php:174 lib/profileaction.php:298 lib/section.php:95
#: lib/subscriptionlist.php:123 lib/tagcloudsection.php:71
msgid "(None)"
msgstr ""
#. TRANS: Link to all group members from mini list of group members if group has more than n members.
-#: actions/showgroup.php:410
+#: actions/showgroup.php:293
msgid "All members"
msgstr ""
#. TRANS: Header for group statistics on a group page (h2).
#. TRANS: H2 text for user statistics.
-#: actions/showgroup.php:441 lib/profileaction.php:205
+#: actions/showgroup.php:324 lib/profileaction.php:205
msgid "Statistics"
msgstr ""
-#: actions/showgroup.php:444
+#: actions/showgroup.php:327
msgctxt "LABEL"
msgid "Created"
msgstr ""
#. TRANS: Label for member count in statistics on group page.
-#: actions/showgroup.php:449
+#: actions/showgroup.php:332
msgctxt "LABEL"
msgid "Members"
msgstr ""
#. TRANS: **%s** is the group alias, %%%%site.name%%%% is the site name,
#. TRANS: %%%%action.register%%%% is the URL for registration, %%%%doc.help%%%% is a URL to help.
#. TRANS: This message contains Markdown links. Ensure they are formatted correctly: [Description](link).
-#: actions/showgroup.php:464
+#: actions/showgroup.php:347
#, php-format
msgid ""
"**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
#. TRANS: Notice on group pages for anonymous users for StatusNet sites that accept no new registrations.
#. TRANS: **%s** is the group alias, %%%%site.name%%%% is the site name,
#. TRANS: This message contains Markdown links. Ensure they are formatted correctly: [Description](link).
-#: actions/showgroup.php:474
+#: actions/showgroup.php:357
#, php-format
msgid ""
"**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en."
msgstr ""
#. TRANS: Header for list of group administrators on a group page (h2).
-#: actions/showgroup.php:503
+#: actions/showgroup.php:386
msgid "Admins"
msgstr ""
msgid "Message from %1$s on %2$s"
msgstr ""
-#: actions/shownotice.php:90
+#: actions/shownotice.php:93
msgid "Notice deleted."
msgstr ""
+#: actions/shownotice.php:248
+msgid "Notice"
+msgstr ""
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
-#: actions/showstream.php:70
+#: actions/showstream.php:69
#, php-format
msgid "%1$s tagged %2$s"
msgstr ""
#. TRANS: Page title showing tagged notices in one user's stream.
#. TRANS: %1$s is the username, %2$s is the hash tag, %3$d is the page number.
-#: actions/showstream.php:74
+#: actions/showstream.php:73
#, php-format
msgid "%1$s tagged %2$s, page %3$d"
msgstr ""
#. TRANS: Extended page title showing tagged notices in one user's stream.
#. TRANS: %1$s is the username, %2$d is the page number.
-#: actions/showstream.php:82
+#: actions/showstream.php:81
#, php-format
msgid "%1$s, page %2$d"
msgstr ""
#. TRANS: Title for link to notice feed.
#. TRANS: %1$s is a user nickname, %2$s is a hashtag.
-#: actions/showstream.php:127
+#: actions/showstream.php:131
#, php-format
msgid "Notice feed for %1$s tagged %2$s (RSS 1.0)"
msgstr ""
#. TRANS: Title for link to notice feed.
#. TRANS: %s is a user nickname.
-#: actions/showstream.php:136
+#: actions/showstream.php:140
#, php-format
msgid "Notice feed for %s (RSS 1.0)"
msgstr ""
#. TRANS: Title for link to notice feed.
#. TRANS: %s is a user nickname.
-#: actions/showstream.php:145
+#: actions/showstream.php:149
#, php-format
msgid "Notice feed for %s (RSS 2.0)"
msgstr ""
-#: actions/showstream.php:152
+#: actions/showstream.php:156
#, php-format
msgid "Notice feed for %s (Atom)"
msgstr ""
#. TRANS: Title for link to notice feed. FOAF stands for Friend of a Friend.
#. TRANS: More information at http://www.foaf-project.org. %s is a user nickname.
-#: actions/showstream.php:159
+#: actions/showstream.php:163
#, php-format
msgid "FOAF for %s"
msgstr ""
#. TRANS: First sentence of empty list message for a stream. $1%s is a user nickname.
-#: actions/showstream.php:205
+#: actions/showstream.php:203
#, php-format
msgid "This is the timeline for %1$s, but %1$s hasn't posted anything yet."
msgstr ""
#. TRANS: Second sentence of empty list message for a stream for the user themselves.
-#: actions/showstream.php:211
+#: actions/showstream.php:209
msgid ""
"Seen anything interesting recently? You haven't posted any notices yet, now "
"would be a good time to start :)"
#. TRANS: Second sentence of empty list message for a non-self stream. %1$s is a user nickname, %2$s is a part of a URL.
#. TRANS: This message contains a Markdown link. Keep "](" together.
-#: actions/showstream.php:215
+#: actions/showstream.php:213
#, php-format
msgid ""
"You can try to nudge %1$s or [post something to them](%%%%action.newnotice%%%"
#. TRANS: Announcement for anonymous users showing a stream if site registrations are open.
#. TRANS: This message contains a Markdown link. Keep "](" together.
-#: actions/showstream.php:258
+#: actions/showstream.php:256
#, php-format
msgid ""
"**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en."
#. TRANS: Announcement for anonymous users showing a stream if site registrations are closed or invite only.
#. TRANS: This message contains a Markdown link. Keep "](" together.
-#: actions/showstream.php:265
+#: actions/showstream.php:263
#, php-format
msgid ""
"**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en."
msgstr ""
#. TRANS: Link to the author of a repeated notice. %s is a linked nickname.
-#: actions/showstream.php:322
+#: actions/showstream.php:327
#, php-format
msgid "Repeat of %s"
msgstr ""
#. TRANS: Menu item for site administration
#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196
-#: lib/adminpanelnav.php:124
+#: lib/adminpanelnav.php:142
msgid "Snapshots"
msgstr ""
msgstr ""
#. TRANS: Checkbox label for enabling Jabber messages for a profile in a subscriptions list.
-#: actions/subscriptions.php:241 lib/settingsnav.php:97
+#: actions/subscriptions.php:241 lib/settingsnav.php:116
msgid "IM"
msgstr ""
#. TRANS: Checkbox label for enabling SMS messages for a profile in a subscriptions list.
-#: actions/subscriptions.php:256 lib/settingsnav.php:104
+#: actions/subscriptions.php:256 lib/settingsnav.php:123
msgid "SMS"
msgstr ""
msgid "Notice feed for tag %s (Atom)"
msgstr ""
-#: actions/tagother.php:39
+#: actions/tagother.php:40
msgid "No ID argument."
msgstr ""
-#: actions/tagother.php:65
+#: actions/tagother.php:66
#, php-format
msgid "Tag %s"
msgstr ""
-#. TRANS: H2 for user profile information.
-#: actions/tagother.php:77 lib/userprofile.php:76
+#: actions/tagother.php:78
msgid "User profile"
msgstr ""
-#: actions/tagother.php:120
+#: actions/tagother.php:121
msgid "Tag user"
msgstr ""
-#: actions/tagother.php:130
+#: actions/tagother.php:131
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
-#: actions/tagother.php:157
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr ""
-
-#: actions/tagother.php:172
+#: actions/tagother.php:175
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
-#: actions/tagother.php:215
+#: actions/tagother.php:218
msgid "Use this form to add tags to your subscribers or subscriptions."
msgstr ""
msgid "Invalid default subscripton: \"%1$s\" is not a user."
msgstr ""
-#: actions/useradminpanel.php:215 lib/personalgroupnav.php:76
-#: lib/settingsnav.php:64 lib/subgroupnav.php:79
+#: actions/useradminpanel.php:215 lib/personalgroupnav.php:79
+#: lib/settingsnav.php:83 lib/subgroupnav.php:79
msgid "Profile"
msgstr ""
msgstr ""
#. TRANS: Menu item for site administration
-#: actions/version.php:167 lib/adminpanelnav.php:132
+#: actions/version.php:167 lib/adminpanelnav.php:150
msgid "License"
msgstr ""
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+#: actions/version.php:191 lib/adminpanelnav.php:158
+msgid "Plugins"
+msgstr ""
+
#. TRANS: Form input field label for application name.
#: actions/version.php:197 lib/applicationeditform.php:190
msgid "Name"
msgstr ""
#. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups().
-#: classes/Notice.php:937
+#: classes/Notice.php:944
msgid "Bad type provided to saveKnownGroups."
msgstr ""
#. TRANS: Server exception thrown when an update for a group inbox fails.
-#: classes/Notice.php:1036
+#: classes/Notice.php:1043
msgid "Problem saving group inbox."
msgstr ""
#. TRANS: Server exception thrown when a reply cannot be saved.
#. TRANS: %1$d is a notice ID, %2$d is the ID of the mentioned user.
-#: classes/Notice.php:1152
+#: classes/Notice.php:1159
#, php-format
msgid "Could not save reply for %1$d, %2$d."
msgstr ""
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
-#: classes/Notice.php:1671
+#: classes/Notice.php:1678
#, php-format
msgid "RT @%1$s %2$s"
msgstr ""
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+#: lib/accountprofileblock.php:103 lib/accountprofileblock.php:118
+msgid "User actions"
+msgstr ""
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+#: lib/accountprofileblock.php:107
+msgid "User deletion in progress..."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+#: lib/accountprofileblock.php:134
+msgid "Edit profile settings"
+msgstr ""
+
+#. TRANS: Link text for link on user profile.
+#: lib/accountprofileblock.php:136
+msgid "Edit"
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+#: lib/accountprofileblock.php:160
+msgid "Send a direct message to this user"
+msgstr ""
+
+#. TRANS: Link text for link on user profile.
+#: lib/accountprofileblock.php:162
+msgid "Message"
+msgstr ""
+
+#. TRANS: Label text on user profile to select a user role.
+#: lib/accountprofileblock.php:204
+msgid "Moderate"
+msgstr ""
+
+#. TRANS: Label text on user profile to select a user role.
+#: lib/accountprofileblock.php:243
+msgid "User role"
+msgstr ""
+
+#. TRANS: Role that can be set for a user profile.
+#: lib/accountprofileblock.php:246
+msgctxt "role"
+msgid "Administrator"
+msgstr ""
+
+#. TRANS: Role that can be set for a user profile.
+#: lib/accountprofileblock.php:248
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
-#: lib/action.php:161
+#: lib/action.php:166
#, php-format
msgid "%1$s - %2$s"
msgstr ""
#. TRANS: Page title for a page without a title set.
-#: lib/action.php:177
+#: lib/action.php:182
msgid "Untitled page"
msgstr ""
#. TRANS: Localized tooltip for '...' expansion button on overlong remote messages.
-#: lib/action.php:331
+#: lib/action.php:355
msgctxt "TOOLTIP"
msgid "Show more"
msgstr ""
#. TRANS: Inline reply form submit button: submits a reply comment.
-#: lib/action.php:334
+#: lib/action.php:358
msgctxt "BUTTON"
msgid "Reply"
msgstr ""
#. TRANS: Placeholder text for inline reply form. Clicking in this box will turn it into a mini notice form.
-#: lib/action.php:337
+#: lib/action.php:361 lib/threadednoticelist.php:317
msgid "Write a reply..."
msgstr ""
-#: lib/action.php:583
+#: lib/action.php:607
msgid "Status"
msgstr ""
#. TRANS: Text between [] is a link description, text between () is the link itself.
#. TRANS: Make sure there is no whitespace between "]" and "(".
#. TRANS: "%%site.broughtby%%" is the value of the variable site.broughtby
-#: lib/action.php:918
+#: lib/action.php:978
#, php-format
msgid ""
"**%%site.name%%** is a microblogging service brought to you by [%%site."
msgstr ""
#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is not set.
-#: lib/action.php:921
+#: lib/action.php:981
#, php-format
msgid "**%%site.name%%** is a microblogging service."
msgstr ""
#. TRANS: Make sure there is no whitespace between "]" and "(".
#. TRANS: Text between [] is a link description, text between () is the link itself.
#. TRANS: %s is the version of StatusNet that is being used.
-#: lib/action.php:928
+#: lib/action.php:988
#, php-format
msgid ""
"It runs the [StatusNet](http://status.net/) microblogging software, version %"
#. TRANS: Content license displayed when license is set to 'private'.
#. TRANS: %1$s is the site name.
-#: lib/action.php:946
+#: lib/action.php:1006
#, php-format
msgid "Content and data of %1$s are private and confidential."
msgstr ""
#. TRANS: Content license displayed when license is set to 'allrightsreserved'.
#. TRANS: %1$s is the copyright owner.
-#: lib/action.php:953
+#: lib/action.php:1013
#, php-format
msgid "Content and data copyright by %1$s. All rights reserved."
msgstr ""
#. TRANS: Content license displayed when license is set to 'allrightsreserved' and no owner is set.
-#: lib/action.php:957
+#: lib/action.php:1017
msgid "Content and data copyright by contributors. All rights reserved."
msgstr ""
#. TRANS: license message in footer.
#. TRANS: %1$s is the site name, %2$s is a link to the license URL, with a licence name set in configuration.
-#: lib/action.php:989
+#: lib/action.php:1049
#, php-format
msgid "All %1$s content and data are available under the %2$s license."
msgstr ""
#. TRANS: Pagination message to go to a page displaying information more in the
#. TRANS: present than the currently displayed information.
-#: lib/action.php:1332
+#: lib/action.php:1392
msgid "After"
msgstr ""
#. TRANS: Pagination message to go to a page displaying information more in the
#. TRANS: past than the currently displayed information.
-#: lib/action.php:1342
+#: lib/action.php:1402
msgid "Before"
msgstr ""
msgid "Unable to delete design setting."
msgstr ""
+#: lib/adminpanelnav.php:65 lib/adminpanelnav.php:69
+#: lib/defaultlocalnav.php:58 lib/personalgroupnav.php:74
+#: lib/settingsnav.php:66 lib/settingsnav.php:70
+msgid "Home"
+msgstr ""
+
#. TRANS: Menu item title/tooltip
-#: lib/adminpanelnav.php:66
+#: lib/adminpanelnav.php:84
msgid "Basic site configuration"
msgstr ""
#. TRANS: Menu item for site administration
-#: lib/adminpanelnav.php:68
+#: lib/adminpanelnav.php:86
msgctxt "MENU"
msgid "Site"
msgstr ""
#. TRANS: Menu item title/tooltip
-#: lib/adminpanelnav.php:74
+#: lib/adminpanelnav.php:92
msgid "Design configuration"
msgstr ""
#. TRANS: Menu item for site administration
#. TRANS: Menu item in the group navigation page. Only shown for group administrators.
-#: lib/adminpanelnav.php:76 lib/groupnav.php:133
+#: lib/adminpanelnav.php:94 lib/groupnav.php:133
msgctxt "MENU"
msgid "Design"
msgstr ""
#. TRANS: Menu item title/tooltip
-#: lib/adminpanelnav.php:82
+#: lib/adminpanelnav.php:100
msgid "User configuration"
msgstr ""
#. TRANS: Menu item for site administration
-#: lib/adminpanelnav.php:84 lib/personalgroupnav.php:88
+#: lib/adminpanelnav.php:102 lib/personalgroupnav.php:91
msgid "User"
msgstr ""
#. TRANS: Menu item title/tooltip
-#: lib/adminpanelnav.php:90
+#: lib/adminpanelnav.php:108
msgid "Access configuration"
msgstr ""
#. TRANS: Menu item title/tooltip
-#: lib/adminpanelnav.php:98
+#: lib/adminpanelnav.php:116
msgid "Paths configuration"
msgstr ""
#. TRANS: Menu item title/tooltip
-#: lib/adminpanelnav.php:106
+#: lib/adminpanelnav.php:124
msgid "Sessions configuration"
msgstr ""
#. TRANS: Menu item title/tooltip
-#: lib/adminpanelnav.php:114
+#: lib/adminpanelnav.php:132
msgid "Edit site notice"
msgstr ""
#. TRANS: Menu item for site administration
-#: lib/adminpanelnav.php:116
+#: lib/adminpanelnav.php:134
msgid "Site notice"
msgstr ""
#. TRANS: Menu item title/tooltip
-#: lib/adminpanelnav.php:122
+#: lib/adminpanelnav.php:140
msgid "Snapshots configuration"
msgstr ""
#. TRANS: Menu item title/tooltip
-#: lib/adminpanelnav.php:130
+#: lib/adminpanelnav.php:148
msgid "Set site license"
msgstr ""
#. TRANS: Menu item title/tooltip
-#: lib/adminpanelnav.php:138
+#: lib/adminpanelnav.php:156
msgid "Plugins configuration"
msgstr ""
msgstr[0] ""
msgstr[1] ""
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-#: lib/command.php:916
-msgid ""
-"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"
-"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.
+#: lib/command.php:915
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on"
+#: lib/command.php:917
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "off"
+#: lib/command.php:919
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "help"
+#: lib/command.php:921
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#: lib/command.php:923
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "groups"
+#: lib/command.php:925
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+#: lib/command.php:927
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+#: lib/command.php:929
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#: lib/command.php:931
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#: lib/command.php:933
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+#: lib/command.php:935
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#: lib/command.php:937
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+#: lib/command.php:939
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+#: lib/command.php:941
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+#: lib/command.php:943
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+#: lib/command.php:945
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#: lib/command.php:947
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+#: lib/command.php:949
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#: lib/command.php:951
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#: lib/command.php:953
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "login"
+#: lib/command.php:955
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#: lib/command.php:957
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stats"
+#: lib/command.php:959
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+#: lib/command.php:961 lib/command.php:963
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+#: lib/command.php:965
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+#: lib/command.php:967
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+#: lib/command.php:969
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#: lib/command.php:971 lib/command.php:973 lib/command.php:977
+#: lib/command.php:979 lib/command.php:981 lib/command.php:983
+#: lib/command.php:985 lib/command.php:987 lib/command.php:989
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+#: lib/command.php:975
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr ""
-#: lib/defaultlocalnav.php:58 lib/personalgroupnav.php:71
-msgid "Home"
-msgstr ""
-
#: lib/defaultlocalnav.php:62 lib/publicgroupnav.php:64
msgid "Public"
msgstr ""
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr ""
+#: lib/groupeditform.php:180
+msgid "Aliases"
+msgstr ""
+
#: lib/groupeditform.php:183
#, php-format
msgid ""
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+#: lib/groupprofileblock.php:94
+msgid "Group actions"
+msgstr ""
+
#. TRANS: Title for groups with the most members section.
#: lib/groupsbymemberssection.php:71
msgid "Groups with most members"
msgstr ""
#. TRANS: Menu item for registering with the StatusNet site.
-#: lib/logingroupnav.php:72
+#: lib/logingroupnav.php:73
msgctxt "MENU"
msgid "Register"
msgstr ""
#. TRANS: Title for menu item for registering with the StatusNet site.
-#: lib/logingroupnav.php:74
+#: lib/logingroupnav.php:75
msgid "Sign up for a new account"
msgstr ""
msgid "Inbox"
msgstr ""
-#: lib/mailboxmenu.php:60 lib/personalgroupnav.php:99
+#: lib/mailboxmenu.php:60 lib/personalgroupnav.php:102
msgid "Your incoming messages"
msgstr ""
msgid "Send"
msgstr ""
-#: lib/messagelist.php:77 lib/personalgroupnav.php:98
+#: lib/messagelist.php:77 lib/personalgroupnav.php:101
msgid "Messages"
msgstr ""
-#: lib/messagelistitem.php:123 lib/noticelist.php:527
+#: lib/messagelistitem.php:123 lib/noticelistitem.php:432
msgid "from"
msgstr ""
-#: lib/microappplugin.php:302
+#: lib/microappplugin.php:340
msgid "Can't get author for activity."
msgstr ""
-#: lib/microappplugin.php:338
+#: lib/microappplugin.php:377
msgid "Bookmark not posted to this group."
msgstr ""
-#: lib/microappplugin.php:351
+#: lib/microappplugin.php:390
msgid "Object not posted to this user."
msgstr ""
-#: lib/microappplugin.php:355
+#: lib/microappplugin.php:394
msgid "Don't know how to handle this kind of target."
msgstr ""
msgstr ""
#. TRANS: Input label in notice form for adding an attachment.
-#: lib/noticeform.php:190
+#: lib/noticeform.php:191
msgid "Attach"
msgstr ""
#. TRANS: Title for input field to attach a file to a notice.
-#: lib/noticeform.php:195
+#: lib/noticeform.php:196
msgid "Attach a file."
msgstr ""
#. TRANS: Field label to add location to a notice.
-#: lib/noticeform.php:224
+#: lib/noticeform.php:225
msgid "Share my location"
msgstr ""
#. TRANS: Text to not share location for a notice in notice form.
-#: lib/noticeform.php:228
+#: lib/noticeform.php:230
msgid "Do not share my location"
msgstr ""
#. TRANS: Timeout error text for location retrieval in notice form.
-#: lib/noticeform.php:230
+#: lib/noticeform.php:232
msgid ""
"Sorry, retrieving your geo location is taking longer than expected, please "
"try again later"
msgstr ""
#. TRANS: Used in coordinates as abbreviation of north
-#: lib/noticelist.php:457
+#: lib/noticelistitem.php:362
msgid "N"
msgstr ""
#. TRANS: Used in coordinates as abbreviation of south
-#: lib/noticelist.php:459
+#: lib/noticelistitem.php:364
msgid "S"
msgstr ""
#. TRANS: Used in coordinates as abbreviation of east
-#: lib/noticelist.php:461
+#: lib/noticelistitem.php:366
msgid "E"
msgstr ""
#. TRANS: Used in coordinates as abbreviation of west
-#: lib/noticelist.php:463
+#: lib/noticelistitem.php:368
msgid "W"
msgstr ""
-#: lib/noticelist.php:465
+#: lib/noticelistitem.php:370
#, php-format
msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
msgstr ""
-#: lib/noticelist.php:474
+#: lib/noticelistitem.php:379
msgid "at"
msgstr ""
-#: lib/noticelist.php:523
+#: lib/noticelistitem.php:428
msgid "web"
msgstr ""
-#: lib/noticelist.php:589
+#: lib/noticelistitem.php:494
msgid "in context"
msgstr ""
-#: lib/noticelist.php:624
+#: lib/noticelistitem.php:529
msgid "Repeated by"
msgstr ""
-#: lib/noticelist.php:651
+#: lib/noticelistitem.php:556
msgid "Reply to this notice"
msgstr ""
-#: lib/noticelist.php:652
+#: lib/noticelistitem.php:557
msgid "Reply"
msgstr ""
-#: lib/noticelist.php:678
+#: lib/noticelistitem.php:583
msgid "Delete this notice"
msgstr ""
-#: lib/noticelist.php:696
+#: lib/noticelistitem.php:601
msgid "Notice repeated"
msgstr ""
+#: lib/noticeplaceholderform.php:54
+msgid "Update your status..."
+msgstr ""
+
#: lib/nudgeform.php:116
msgid "Nudge this user"
msgstr ""
msgid "Couldn't insert new subscription."
msgstr ""
-#: lib/personalgroupnav.php:77
+#: lib/personalgroupnav.php:80
msgid "Your profile"
msgstr ""
-#: lib/personalgroupnav.php:82
+#: lib/personalgroupnav.php:85
msgid "Replies"
msgstr ""
-#: lib/personalgroupnav.php:87
+#: lib/personalgroupnav.php:90
msgid "Favorites"
msgstr ""
msgid "(Plugin descriptions unavailable when disabled.)"
msgstr ""
-#: lib/primarynav.php:57
+#: lib/primarynav.php:57 lib/settingsnav.php:78
msgid "Settings"
msgstr ""
msgid "More..."
msgstr ""
-#: lib/settingsnav.php:65
+#: lib/settingsnav.php:84
msgid "Change your profile settings"
msgstr ""
-#: lib/settingsnav.php:70
+#: lib/settingsnav.php:89
msgid "Upload an avatar"
msgstr ""
-#: lib/settingsnav.php:75
+#: lib/settingsnav.php:94
msgid "Change your password"
msgstr ""
-#: lib/settingsnav.php:80
+#: lib/settingsnav.php:99
msgid "Change email handling"
msgstr ""
-#: lib/settingsnav.php:85
+#: lib/settingsnav.php:104
msgid "Design your profile"
msgstr ""
-#: lib/settingsnav.php:89
+#: lib/settingsnav.php:108
msgid "URL"
msgstr ""
-#: lib/settingsnav.php:90
+#: lib/settingsnav.php:109
msgid "URL shorteners"
msgstr ""
-#: lib/settingsnav.php:98
+#: lib/settingsnav.php:117
msgid "Updates by instant messenger (IM)"
msgstr ""
-#: lib/settingsnav.php:105
+#: lib/settingsnav.php:124
msgid "Updates by SMS"
msgstr ""
-#: lib/settingsnav.php:110
+#: lib/settingsnav.php:129
msgid "Connections"
msgstr ""
-#: lib/settingsnav.php:111
+#: lib/settingsnav.php:130
msgid "Authorized connected applications"
msgstr ""
msgstr ""
#. TRANS: Server exception displayed if a theme name was invalid.
-#: lib/theme.php:74
+#: lib/theme.php:77
msgid "Invalid theme name."
msgstr ""
msgid "Error opening theme archive."
msgstr ""
-#: lib/threadednoticelist.php:270
+#: lib/threadednoticelist.php:273
#, php-format
msgid "Show %d reply"
msgid_plural "Show all %d replies"
msgid "User %1$s (%2$d) has no profile record."
msgstr ""
-#: lib/userprofile.php:118
-msgid "Edit Avatar"
-msgstr ""
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-#: lib/userprofile.php:220 lib/userprofile.php:236
-msgid "User actions"
-msgstr ""
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-#: lib/userprofile.php:224
-msgid "User deletion in progress..."
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-#: lib/userprofile.php:252
-msgid "Edit profile settings"
-msgstr ""
-
-#. TRANS: Link text for link on user profile.
-#: lib/userprofile.php:254
-msgid "Edit"
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-#: lib/userprofile.php:278
-msgid "Send a direct message to this user"
-msgstr ""
-
-#. TRANS: Link text for link on user profile.
-#: lib/userprofile.php:280
-msgid "Message"
-msgstr ""
-
-#. TRANS: Label text on user profile to select a user role.
-#: lib/userprofile.php:322
-msgid "Moderate"
-msgstr ""
-
-#. TRANS: Label text on user profile to select a user role.
-#: lib/userprofile.php:361
-msgid "User role"
-msgstr ""
-
-#. TRANS: Role that can be set for a user profile.
-#: lib/userprofile.php:364
-msgctxt "role"
-msgid "Administrator"
-msgstr ""
-
-#. TRANS: Role that can be set for a user profile.
-#: lib/userprofile.php:366
-msgctxt "role"
-msgid "Moderator"
-msgstr ""
-
#: lib/util.php:321
msgid "Not allowed to log in."
msgstr ""
#. TRANS: Used in notices to indicate when the notice was made compared to now.
-#: lib/util.php:1337
+#: lib/util.php:1331
msgid "a few seconds ago"
msgstr ""
#. TRANS: Used in notices to indicate when the notice was made compared to now.
-#: lib/util.php:1340
+#: lib/util.php:1334
msgid "about a minute ago"
msgstr ""
#. TRANS: Used in notices to indicate when the notice was made compared to now.
-#: lib/util.php:1344
+#: lib/util.php:1338
#, php-format
msgid "about one minute ago"
msgid_plural "about %d minutes ago"
msgstr[1] ""
#. TRANS: Used in notices to indicate when the notice was made compared to now.
-#: lib/util.php:1347
+#: lib/util.php:1341
msgid "about an hour ago"
msgstr ""
#. TRANS: Used in notices to indicate when the notice was made compared to now.
-#: lib/util.php:1351
+#: lib/util.php:1345
#, php-format
msgid "about one hour ago"
msgid_plural "about %d hours ago"
msgstr[1] ""
#. TRANS: Used in notices to indicate when the notice was made compared to now.
-#: lib/util.php:1354
+#: lib/util.php:1348
msgid "about a day ago"
msgstr ""
#. TRANS: Used in notices to indicate when the notice was made compared to now.
-#: lib/util.php:1358
+#: lib/util.php:1352
#, php-format
msgid "about one day ago"
msgid_plural "about %d days ago"
msgstr[1] ""
#. TRANS: Used in notices to indicate when the notice was made compared to now.
-#: lib/util.php:1361
+#: lib/util.php:1355
msgid "about a month ago"
msgstr ""
#. TRANS: Used in notices to indicate when the notice was made compared to now.
-#: lib/util.php:1365
+#: lib/util.php:1359
#, php-format
msgid "about one month ago"
msgid_plural "about %d months ago"
msgstr[1] ""
#. TRANS: Used in notices to indicate when the notice was made compared to now.
-#: lib/util.php:1368
+#: lib/util.php:1362
msgid "about a year ago"
msgstr ""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:31+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:20+0000\n"
"Language-Team: Swedish <http://translatewiki.net/wiki/Portal:sv>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: sv\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgstr "%s favoriter"
#. TRANS: Title for Atom feed with a user's memberships. %s is a user nickname.
-#, fuzzy, php-format
+#, php-format
msgid "%s memberships"
-msgstr "%s gruppmedlemmar"
+msgstr "%s medlemskap"
#. TRANS: Client error displayed when users try to block themselves.
msgid "You cannot block yourself!"
msgid "%s's groups"
msgstr "%ss grupper"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%1$s grupper %2$s är en medlem i."
msgid "Repeats of %s"
msgstr "Upprepningar av %s"
-#, fuzzy, php-format
+#, php-format
msgid "%1$s notices that %2$s / %3$s has repeated."
-msgstr "%s (@%s) lade till din notis som en favorit"
+msgstr "%1$s meddelanden som %2$s / %3$s har upprepat."
#. TRANS: Title for timeline with lastest notices with a given tag.
#. TRANS: %s is the tag.
msgstr "Uppdateringar taggade med %1$s på %2$s!"
#. TRANS: Client error displayed trying to add a notice to another user's timeline.
-#, fuzzy
msgid "Only the user can add to their own timeline."
-msgstr "Bara användaren kan läsa sina egna brevlådor."
+msgstr "Bara användaren kan lägga till sin egen tidslinje."
#. TRANS: Client error displayed when using another format than AtomPub.
msgid "Only accept AtomPub for Atom feeds."
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Okänd"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
msgstr "Hitta innehåll i notiser"
#. TRANS: Client exception thrown when trying to subscribe to a non-existing group.
-#, fuzzy
msgid "Unknown group."
-msgstr "Okänd"
+msgstr "Okänd grupp."
#. TRANS: Client exception thrown when trying to subscribe to an already subscribed group.
-#, fuzzy
msgid "Already a member."
-msgstr "Alla medlemmar"
+msgstr "Redan medlem."
#. TRANS: Client exception thrown when trying to subscribe to group while blocked from that group.
msgid "Blocked by admin."
-msgstr ""
+msgstr "Blockerad av admin."
#. TRANS: Client exception thrown when referencing a non-existing favorite.
-#, fuzzy
msgid "No such favorite."
-msgstr "Ingen sådan fil."
+msgstr "Ingen sådan favorit."
#. TRANS: Client exception thrown when trying to remove a favorite notice of another user.
-#, fuzzy
msgid "Cannot delete someone else's favorite."
-msgstr "Kunde inte ta bort favoriten."
+msgstr "Kan inte ta bort någon annans favoriter."
#. TRANS: Client exception thrown when referencing a non-existing group.
#. TRANS: Client error displayed when requesting a list of blocked users for a non-local group.
msgstr "Ingen sådan grupp."
#. TRANS: Client exception thrown when trying to show membership of a non-subscribed group
-#, fuzzy
msgid "Not a member."
-msgstr "Alla medlemmar"
+msgstr "Inte medlem."
#. TRANS: Client exception thrown when deleting someone else's membership.
-#, fuzzy
msgid "Cannot delete someone else's membership."
-msgstr "Kunde inte spara prenumeration."
+msgstr "Kan inte ta bort någon annans medlemskap."
#. TRANS: Client exception thrown when trying to display a subscription for a non-existing profile ID.
#. TRANS: %d is the non-existing profile ID number.
-#, fuzzy, php-format
+#, php-format
msgid "No such profile id: %d."
-msgstr "Ingen sådan profil."
+msgstr "Inget sådant profil-ID: %d."
#. TRANS: Client exception thrown when trying to display a subscription for a non-subscribed profile ID.
#. TRANS: %1$d is the non-existing subscriber ID number, $2$d is the ID of the profile that was not subscribed to.
#. TRANS: Confirmation text for user deletion. The user has to type this exactly the same, including punctuation.
msgid "I am sure."
-msgstr ""
+msgstr "Jag är säker."
#. TRANS: Notification for user about the text that must be input to be able to delete a user account.
#. TRANS: %s is the text that needs to be input.
#, php-format
msgid "You must write \"%s\" exactly in the box."
-msgstr ""
+msgstr "Du måste skriva precis \"%s\" i rutan."
#. TRANS: Confirmation that a user account has been deleted.
-#, fuzzy
msgid "Account deleted."
-msgstr "Avatar borttagen."
+msgstr "Konto borttaget."
#. TRANS: Page title for page on which a user account can be deleted.
#. TRANS: Option in profile settings to delete the account of the currently logged in user.
-#, fuzzy
msgid "Delete account"
-msgstr "Skapa ett konto"
+msgstr "Ta bort konto"
#. TRANS: Form text for user deletion form.
msgid ""
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgstr "Upprepa bakgrundsbild"
#. TRANS: Fieldset legend for theme colors.
-#, fuzzy
msgid "Change colors"
msgstr "Byt färger"
msgid "Could not create application."
msgstr "Kunde inte skapa applikation."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Ogiltig storlek."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Ny grupp"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "Detta är din utkorg som innehåller privata meddelanden du har skickat."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Byt lösenord"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Byt ditt lösenord."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Byte av lösenord"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Gammalt lösenord"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Nytt lösenord"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "Minst 6 tecken"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Bekräfta"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "Samma som lösenordet ovan"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Ändra"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Lösenordet måste vara minst 6 tecken."
msgid "Passwords don't match."
msgstr "Lösenorden matchar inte."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Felaktigt gammalt lösenord"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Fel vid sparande av användare; ogiltig."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Kan inte spara nytt lösenord."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Lösenord sparat."
msgid "Server"
msgstr "Server"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Värdnamn för webbplatsens server."
msgid "Path"
msgstr "Sökväg"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Sökväg till webbplats."
msgid "Locale directory"
msgstr "Katalog med lokaliseringsfiler (locales)"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Katalogsökväg till lokaliseringfiler (locales)."
msgid "Fancy URLs"
msgstr "Utsmyckade URL:er"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
"Skall utsmyckade URL:er användas (mer läsbara och lättare att komma ihåg)?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Teman"
msgstr "Katalogsökväg till lokaliseringfiler (locales)"
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "Personsökning"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Inte en giltig persontagg: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Användare som taggat sig själv med %1$s - sida %2$d"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Denna åtgärd accepterar endast POST-begäran."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Du kan inte ta bort användare."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Ingen sådan sida"
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Insticksmoduler"
msgid "Default plugins"
msgstr "Standardspråk"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Ogiltigt notisinnehåll."
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "Licensen för notiser ‘%1$s’ är inte förenlig webbplatslicensen ‘%2$s’."
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Ogiltig tagg: \"%s\""
msgid "Restore account"
msgstr "Skapa ett konto"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Bortom sidbegränsningen (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Kunde inte hämta publik ström."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Publik tidslinje, sida %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Publik tidslinje"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Publikt flöde av ström (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Publikt flöde av ström (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Publikt flöde av ström (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"Detta är den publika tidslinjen för %%site.name%% men ingen har postat något "
"än."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Bli först att posta!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Varför inte [registrera ett konto](%%action.register%%) och bli först att "
"posta!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"net/). [Gå med nu](%%action.register%%) för att dela notiser om dig själv "
"med vänner, familj och kollegor! ([Läs mer](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "%1$s grupp, sida %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Notis"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Alias"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Åtgärder för grupp"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Notis borttagen."
+msgid "Notice"
+msgstr "Notiser"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Tagg %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Användarprofil"
msgid "Tag user"
msgstr "Tagga användare"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Taggar för denna användare (bokstäver, nummer, -, ., och _), separerade med "
"kommatecken eller mellanslag"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Ogiltig tagg: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Du bör ha fått en kopia av GNU Affero General Public License tillsammans med "
"detta program. Om inte, se %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Insticksmoduler"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Namn"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Åtgärder för användare"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Borttagning av användare pågår..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Redigera profilinställningar"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Redigera"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Skicka ett direktmeddelande till denna användare"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Meddelande"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Moderera"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Användarroll"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Administratör"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Moderator"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Kunde inte ta bort utseendeinställning."
+msgid "Home"
+msgstr "Hemsida"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Grundläggande webbplatskonfiguration"
msgstr[0] "Du är en medlem i denna grupp:"
msgstr[1] "Du är en medlem i dessa grupper:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Kommandon:\n"
-"on - sätt på notifikationer\n"
-"off - stäng av notifikationer\n"
-"help - visa denna hjälp\n"
-"follow <smeknamn> - prenumerera på användare\n"
-"groups - lista grupperna du tillhör\n"
-"subscriptions - lista personerna du följer\n"
-"subscribers - lista personerna som följer dig\n"
-"leave <smeknamn> - avsluta prenumeration på användare\n"
-"d <smeknamn> <text> - direktmeddelande till användare\n"
-"get <smeknamn> - hämta senaste notis från användare\n"
-"whois <smeknamn> - hämta profilinformation om användare\n"
-"lose <smeknamn> - tvinga användare att sluta följa dig\n"
-"fav <smeknamn> - lägg till användarens senaste notis som favorit\n"
-"fav #<notisid> - lägg till notis med given id som favorit\n"
-"repeat #<notisid> - upprepa en notis med en given id\n"
-"repeat <smeknamn> - upprepa den senaste notisen från användare\n"
-"reply #<notisid> - svara på notis med en given id\n"
-"reply <smeknamn> - svara på den senaste notisen från användare\n"
-"join <grupp> - gå med i grupp\n"
-"login - hämta en länk till webbgränssnittets inloggningssida\n"
-"drop <grupp> - lämna grupp\n"
-"stats - hämta din statistik\n"
-"stop - samma som 'off'\n"
-"quit - samma som 'off'\n"
-"sub <smeknamn> - samma som 'follow'\n"
-"unsub <smeknamn> - samma som 'leave'\n"
-"last <smeknamn> - samma som 'get'\n"
-"on <smeknamn> - inte implementerat än.\n"
-"off <smeknamn> - inte implementerat än.\n"
-"nudge <smeknamn> - påminn en användare om att uppdatera\n"
-"invite <telefonnummer> - inte implementerat än.\n"
-"track <ord> - inte implementerat än.\n"
-"untrack <ord> - inte implementerat än.\n"
-"track off - inte implementerat än.\n"
-"untrack all - inte implementerat än.\n"
-"tracks - inte implementerat än.\n"
-"tracking - inte implementerat än.\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Resultat av kommando"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Kan inte stänga av notifikation."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Kan inte sätta på notifikation."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Prenumerera på denna användare"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Avsluta prenumerationen på denna användare"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Direktmeddelande till %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Profilinformation"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Upprepa denna notis"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Svara på denna notis"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Okänd grupp."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Ta bort grupp"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Kommando inte implementerat än."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
#, fuzzy
msgid "Database error"
msgstr "Databasfel"
-msgid "Home"
-msgstr "Hemsida"
-
msgid "Public"
msgstr "Publikt"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "Plats för gruppen, om den finns, såsom \"Stad, Län, Land\""
+msgid "Aliases"
+msgstr "Alias"
+
#, fuzzy, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Lägg till eller redigera %s utseende"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Åtgärder för grupp"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Grupper med flest medlemmar"
msgid "Notice repeated"
msgstr "Notis upprepad"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "Knuffa denna användare"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Användaren har ingen profil."
-msgid "Edit Avatar"
-msgstr "Redigera avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Åtgärder för användare"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Borttagning av användare pågår..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Redigera profilinställningar"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Redigera"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Skicka ett direktmeddelande till denna användare"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Meddelande"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Moderera"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Användarroll"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Administratör"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Moderator"
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Inte inloggad."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s tidslinje"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Hitta personer på denna webbplats"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Ogiltig tagg: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:32+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:21+0000\n"
"Language-Team: Telugu <http://translatewiki.net/wiki/Portal:te>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: te\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
#. TRANS: %d is the maximum number of characters for the description.
#. TRANS: Group create form validation error.
#. TRANS: %d is the maximum number of allowed characters.
-#, fuzzy, php-format
+#, php-format
msgid "Description is too long (maximum %d character)."
msgid_plural "Description is too long (maximum %d characters)."
msgstr[0] "వివరణ చాలా పెద్దగా ఉంది (%d అక్షరాలు గరిష్ఠం)."
#. TRANS: Group edit form validation error.
#. TRANS: Group create form validation error.
#. TRANS: Validation error in form for profile settings.
-#, fuzzy
msgid "Location is too long (maximum 255 characters)."
msgstr "ప్రాంతం పేరు మరీ పెద్దగా ఉంది (255 అక్షరాలు గరిష్ఠం)."
#. TRANS: %d is the maximum number of allowed aliases.
#. TRANS: Group create form validation error.
#. TRANS: %d is the maximum number of allowed aliases.
-#, fuzzy, php-format
+#, php-format
msgid "Too many aliases! Maximum %d allowed."
msgid_plural "Too many aliases! Maximum %d allowed."
msgstr[0] "చాలా మారుపేర్లు! %d గరిష్ఠం."
msgid "%s's groups"
msgstr "%s యొక్క గుంపులు"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%2$s సభ్యులుగా ఉన్న %2$s గుంపులు."
#. TRANS: API validation exception thrown when alias is the same as nickname.
#. TRANS: Group create form validation error.
-#, fuzzy
msgid "Alias cannot be the same as nickname."
-msgstr "మారà±\81à°ªà±\87à°°à±\81 à°ªà±\87à°°à±\81à°¤à±\8b సమానà°\82à°\97à°¾ à°\89à°\82à°¡కూడదు."
+msgstr "మారà±\81à°ªà±\87à°°à±\81 à°®à±\81à°¦à±\8dà°¦à±\81à°ªà±\87à°°à±\82 à°\92à°\95à°\9fà±\87 à°\95à°¾కూడదు."
#. TRANS: Client error displayed when uploading a media file has failed.
msgid "Upload failed."
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "తెలియని చర్య"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
-#, fuzzy
msgid "Already a favorite."
-msgstr "à°\87à°·à±\8dà°\9fà°¾à°\82శాలà°\95à±\81 à°\9aà±\87à°°à±\8dà°\9aà±\81"
+msgstr "à°\85ది à°\87à°ªà±\8dà°ªà°\9fà°¿à°\95à±\87 à°\87à°·à±\8dà°\9fà°¾à°\82à°¶à°\82."
#. TRANS: Title for group membership feed.
#. TRANS: %s is a username.
-#, fuzzy, php-format
+#, php-format
msgid "%s group memberships"
-msgstr "%s à°\97à±\81à°\82à°ªà±\81 à°¸à°à±\8dà°¯à±\81లు"
+msgstr "%s à°\97à±\81à°\82à°ªà±\81 à°¸à°à±\8dయతà±\8dవాలు"
#. TRANS: Subtitle for group membership feed.
#. TRANS: %1$s is a username, %2$s is the StatusNet sitename.
-#, fuzzy, php-format
+#, php-format
msgid "Groups %1$s is a member of on %2$s"
-msgstr "%s సభ్యులుగా ఉన్న గుంపులు"
+msgstr "%2$sలో %1$s సభ్యులుగా ఉన్న గుంపులు"
#. TRANS: Client exception thrown when trying subscribe someone else to a group.
#, fuzzy
msgstr "సైటు గమనికని భద్రపరచు"
#. TRANS: Client exception thrown when trying to subscribe to a non-existing group.
-#, fuzzy
msgid "Unknown group."
-msgstr "à°¤à±\86లియని à°\9aà°°à±\8dà°¯"
+msgstr "à°\97à±\81à°°à±\8dà°¤à±\81à°¤à±\86లియని à°\97à±\81à°\82à°ªà±\81."
#. TRANS: Client exception thrown when trying to subscribe to an already subscribed group.
msgid "Already a member."
#. TRANS: Client exception thrown when trying to subscribe to group while blocked from that group.
msgid "Blocked by admin."
-msgstr ""
+msgstr "నిర్వాహకులు నిరోధించారు."
#. TRANS: Client exception thrown when referencing a non-existing favorite.
-#, fuzzy
msgid "No such favorite."
-msgstr "à°\85à°\9fà±\81à°µà°\82à°\9fà°¿ à°«à±\88à°²à±\81 లేదు."
+msgstr "à°\85à°\9fà±\81à°µà°\82à°\9fà°¿ à°\87à°·à±\8dà°\9fà°¾à°\82à°¶à°\82 లేదు."
#. TRANS: Client exception thrown when trying to remove a favorite notice of another user.
-#, fuzzy
msgid "Cannot delete someone else's favorite."
-msgstr "à°\87à°·à±\8dà°\9fà°¾à°\82శానà±\8dని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°²à±\87à°\95à°ªà±\8bయాà°\82."
+msgstr "మరà±\8aà°\95à°°à°¿ à°\87à°·à±\8dà°\9fà°¾à°\82శానà±\8dని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°²à±\87à°°à±\81."
#. TRANS: Client exception thrown when referencing a non-existing group.
#. TRANS: Client error displayed when requesting a list of blocked users for a non-local group.
#. TRANS: Subtitle for Atom subscription feed.
#. TRANS: %1$s is a user nickname, %s$s is the StatusNet sitename.
-#, fuzzy, php-format
+#, php-format
msgid "People %1$s has subscribed to on %2$s"
-msgstr "%sకి చందాచేరిన వ్యక్తులు"
+msgstr "%2$sలో %1$s చందాచేరిన వ్యక్తులు"
#. TRANS: Client error displayed when not using the follow verb.
msgid "Can only handle Follow activities."
msgstr "ఏ దస్త్రమూ ఎక్కింపబడలేదు."
#. TRANS: Avatar upload form instruction after uploading a file.
-#, fuzzy
msgid "Pick a square area of the image to be your avatar."
-msgstr "à°®à±\80 à°\85వతారానిà°\95à°¿ à°\97ానà±\82 à°\88 à°\9aà°¿à°¤à±\8dà°°à°\82 à°¨à±\81à°\82à°¡à°¿ à°\92à°\95 à°\9aà°¤à±\81à°°à°¸à±\8dà°°à°ªà±\81 à°ªà±\8dà°°à°¦à±\87శానà±\8dని à°\8eà°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿"
+msgstr "à°®à±\80 à°\85వతారà°\82à°\97à°¾ à°\89à°\82డాలà±\8dసిన à°\9aà°¤à±\81à°°à°¸à±\8dà°°à°ªà±\81 à°ªà±\8dà°°à°¦à±\87శానà±\8dని à°¬à±\8aà°®à±\8dà°® à°¨à±\81à°\82à°¡à°¿ à°\8eà°\82à°\9aà±\81à°\95à±\8bà°\82à°¡à°¿."
#. TRANS: Server error displayed if an avatar upload went wrong somehow server side.
#. TRANS: Server error displayed trying to crop an uploaded group logo that is no longer present.
msgstr "కాదు"
#. TRANS: Submit button title for 'No' when blocking a user.
-#, fuzzy
msgid "Do not block this user."
-msgstr "à°\88 వాడà±\81à°\95రిని నిరà±\8bధిà°\82à°\9aà°\95à±\81"
+msgstr "à°\88 వాడà±\81à°\95రిని నిరà±\8bధిà°\82à°\9aవదà±\8dà°¦à±\81."
#. TRANS: Button label on the user block form.
#. TRANS: Button label on the delete application form.
#. TRANS: Page title for page on which a user account can be deleted.
#. TRANS: Option in profile settings to delete the account of the currently logged in user.
-#, fuzzy
msgid "Delete account"
-msgstr "ఖాతాని సృష్టించుకోండి"
+msgstr "ఖాతా తొలగింపు"
#. TRANS: Form text for user deletion form.
msgid ""
"వాడుకరుల అనుసంధానాలతో సహా, డాటాబేసు నుండి తొలగిస్తుంది."
#. TRANS: Submit button title for 'No' when deleting an application.
-#, fuzzy
msgid "Do not delete this application."
-msgstr "à°\88 à°\89à°ªà°\95రణానà±\8dని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°\95à±\81"
+msgstr "à°\88 à°\89à°ªà°\95రణానà±\8dని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aవదà±\8dà°¦à±\81."
#. TRANS: Submit button title for 'Yes' when deleting an application.
-#, fuzzy
msgid "Delete this application."
-msgstr "ఈ ఉపకరణాన్ని తొలగించు"
+msgstr "ఈ ఉపకరణాన్ని తొలగించు."
#. TRANS: Client error when trying to delete group while not logged in.
msgid "You must be logged in to delete a group."
"వెనక్కి తేలేకుండా."
#. TRANS: Submit button title for 'No' when deleting a group.
-#, fuzzy
msgid "Do not delete this group."
-msgstr "à°\88 à°\97à±\81à°\82à°ªà±\81à°¨à±\81 à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°\95à±\81"
+msgstr "à°\88 à°\97à±\81à°\82à°ªà±\81à°¨à±\81 à°¤à±\8aà°²à°\97à°¿à°\82à°\9aవదà±\8dà°¦à±\81."
#. TRANS: Submit button title for 'Yes' when deleting a group.
-#, fuzzy
msgid "Delete this group."
-msgstr "ఈ గుంపుని తొలగించు"
+msgstr "ఈ గుంపుని తొలగించు."
#. TRANS: Error message displayed trying to delete a notice while not logged in.
#. TRANS: Client error displayed when trying to remove a favorite while not logged in.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgstr "మీరు నిజంగానే ఈ నోటీసుని తొలగించాలనుకుంటున్నారా?"
#. TRANS: Submit button title for 'No' when deleting a notice.
-#, fuzzy
msgid "Do not delete this notice."
-msgstr "à°\88 à°¨à±\8bà°\9fà±\80à°¸à±\81ని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°\95à±\81"
+msgstr "à°\88 à°¨à±\8bà°\9fà±\80à°¸à±\81ని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aవదà±\8dà°¦à±\81."
#. TRANS: Submit button title for 'Yes' when deleting a notice.
-#, fuzzy
msgid "Delete this notice."
-msgstr "ఈ నోటీసుని తొలగించు"
+msgstr "ఈ నోటీసుని తొలగించు."
#. TRANS: Client error displayed when trying to delete a user without having the right to delete users.
msgid "You cannot delete users."
msgstr "మీరు స్థానిక వాడుకరులను మాత్రమే తొలగించగలరు."
#. TRANS: Title of delete user page.
-#, fuzzy
msgctxt "TITLE"
msgid "Delete user"
-msgstr "వాడుకరిని తొలగించు"
+msgstr "వాడుకరి తొలగింపు"
#. TRANS: Fieldset legend on delete user page.
msgid "Delete user"
msgstr "సైటుకి అలంకారం."
#. TRANS: Field label for uploading a cutom theme.
-#, fuzzy
msgid "Custom theme"
-msgstr "à°¸à±\88à°\9fà±\81 అలంకారం"
+msgstr "à°\85à°à°¿à°®à°¤ అలంకారం"
#. TRANS: Form instructions for uploading a cutom StatusNet theme.
msgid "You can upload a custom StatusNet theme as a .ZIP archive."
#. TRANS: Client exception thrown when requesting a document from the documentation that does not exist.
#. TRANS: %s is the non-existing document.
-#, fuzzy, php-format
+#, php-format
msgid "No such document \"%s\"."
-msgstr "అటువంటి జోడింపు లేదు."
+msgstr "\"%s\" అనే పత్రం లేదు."
#. TRANS: Title for "Edit application" form.
#. TRANS: Form legend.
#. TRANS: Validation error shown when providing too long a name in the "Edit application" form.
#. TRANS: Validation error shown when providing too long a name in the "New application" form.
-#, fuzzy
msgid "Name is too long (maximum 255 characters)."
msgstr "పేరు చాలా పెద్దగా ఉంది (గరిష్ఠంగా 255 అక్షరాలు)."
msgstr "సంస్థ తప్పనిసరి."
#. TRANS: Validation error shown when providing too long an arganisation name in the "Edit application" form.
-#, fuzzy
msgid "Organization is too long (maximum 255 characters)."
msgstr "సంస్థ పేరు మరీ పెద్దగా ఉంది (255 అక్షరాలు గరిష్ఠం)."
"తొలగిస్తాం, ఇక భవిష్యత్తులో వారు గుంపులో ప్రచురించలేరు, మరియు గుంపుకి చందాచేరలేరు."
#. TRANS: Submit button title for 'No' when blocking a user from a group.
-#, fuzzy
msgid "Do not block this user from this group."
-msgstr "à°\88 వాడà±\81à°\95రిని à°\88 à°\97à±\81à°\82à°ªà±\81 à°¨à±\81à°\82à°¡à°¿ నిరà±\8bధిà°\82à°\9aà°\95à±\81"
+msgstr "à°\88 వాడà±\81à°\95రిని à°\88 à°\97à±\81à°\82à°ªà±\81 à°¨à±\81à°\82à°¡à°¿ నిరà±\8bధిà°\82à°\9aవదà±\8dà°¦à±\81."
#. TRANS: Submit button title for 'Yes' when blocking a user from a group.
msgid "Block this user from this group."
#. TRANS: Page notice of group list. %%%%site.name%%%% is the StatusNet site name,
#. TRANS: %%%%action.groupsearch%%%% and %%%%action.newgroup%%%% are URLs. Do not change them.
#. TRANS: This message contains Markdown links in the form [link text](link).
-#, fuzzy, php-format
+#, php-format
msgid ""
"%%%%site.name%%%% groups let you find and talk with people of similar "
"interests. After you join a group you can send messages to all other members "
msgstr ""
"ఒకే రకమైన ఆసక్తులు ఉన్న వ్యక్తులు కలుసుకోడానికి మరియు మాట్లాడుకోడానికి %%%%site.name%%%% "
"గుంపులు వీలుకల్పిస్తాయి. ఒక గుంపులో చేరిన తర్వాత మీరు \"!groupname\" అన్న సంకేతం ద్వారా ఆ "
-"à°\97à±\81à°\82à°ªà±\81 à°²à±\8bని à°¸à°à±\8dà°¯à±\81à°²à°\82దరిà°\95à±\80 à°¸à°\82à°¦à±\87శాలని à°ªà°\82పిà°\82à°\9aà°µà°\9aà±\8dà°\9aà±\81. à°®à±\80à°\95à±\81 à°¨à°\9aà±\8dà°\9aà°¿à°¨ à°\97à±\81à°\82à°ªà±\81 à°\95నబడలà±\87దా? [దాని à°\95à±\8bà°¸à°\82 à°µà±\86à°¤à°\95à°\82à°¡à°¿](%%"
-"%%action.groupsearch%%%%) లేదా [మీరే కొత్తది సృష్టించండి!](%%%%action.newgroup%%%%)"
+"à°\97à±\81à°\82à°ªà±\81 à°²à±\8bని à°¸à°à±\8dà°¯à±\81à°²à°\82దరిà°\95à±\80 à°¸à°\82à°¦à±\87శాలనà±\81 à°ªà°\82పిà°\82à°\9aà°µà°\9aà±\8dà°\9aà±\81. à°®à±\80à°\95à±\81 à°¨à°\9aà±\8dà°\9aà°¿à°¨ à°\97à±\81à°\82à°ªà±\81 à°\95నబడలà±\87దా? [దాని à°\95à±\8bà°¸à°\82 à°µà±\86à°¤à°\95à°\82à°¡à°¿](%"
+"%%%action.groupsearch%%%%) లేదా [మీరే కొత్తది సృష్టించండి!](%%%%action.newgroup%%%%)"
#. TRANS: Link to create a new group on the group list page.
msgid "Create a new group"
msgstr "రకం"
#. TRANS: Dropdown field instructions in the license admin panel.
-#, fuzzy
msgid "Select a license."
-msgstr "లైసెన్సును ఎంచుకోండి"
+msgstr "లైసెన్సును ఎంచుకోండి."
#. TRANS: Form legend in the license admin panel.
msgid "License details"
msgstr "భవిష్యత్తులో ఆటోమెటిగ్గా లోనికి ప్రవేశించు; బయటి కంప్యూర్ల కొరకు కాదు!"
#. TRANS: Button text for log in on login page.
-#, fuzzy
msgctxt "BUTTON"
msgid "Login"
msgstr "ప్రవేశించండి"
msgid "Could not create application."
msgstr "ఉపకరణాన్ని సృష్టించలేకపోయాం."
+#, fuzzy
+msgid "Invalid image."
+msgstr "తప్పుడు పరిమాణం."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "కొత్త గుంపు"
#. TRANS: Client exception thrown when a user tries to create a group while banned.
-#, fuzzy
msgid "You are not allowed to create groups on this site."
-msgstr "à°\88 à°\97à±\81à°\82à°ªà±\81à°¨à±\81 à°¤à±\8aà°²à°\97ించడానికి మీకు అనుమతి లేదు."
+msgstr "à°\88 à°¸à±\88à°\9fà±\81à°²à±\8b à°\97à±\81à°\82à°ªà±\81లనà±\81 à°¸à±\83à°·à±\8dà°\9fించడానికి మీకు అనుమతి లేదు."
#. TRANS: Form instructions for group create form.
msgid "Use this form to create a new group."
msgid "This is your outbox, which lists private messages you have sent."
msgstr "ఇవి మీరు పంపివున్న అంతరంగిక సందేశాలు."
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "సంకేతపదం మార్చుకోండి"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "మీ సంకేతపదం మార్చుకోండి."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "సంకేతపదం మార్పు"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "పాత సంకేతపదం"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "కొత్త సంకేతపదం"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "6 లేదా అంతకంటే ఎక్కువ అక్షరాలు."
-#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "నిర్థారించు"
+
+#. TRANS: Field title on page where to change password.
+#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
-msgstr "పై సంకేతపదం వలెనే"
+msgstr "పై సంకేతపదం వలెనే."
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "మార్చు"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "సంకేతపదం తప్పనిసరిగా 6 లేదా అంతకంటే ఎక్కువ అక్షరాలుండాలి."
msgid "Passwords don't match."
msgstr "సంకేతపదాలు సరిపోలలేదు."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "పాత సంకేతపదం తప్పు"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "వాడుకరిని భద్రపరచడంలో పొరపాటు: సరికాదు."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
-#, fuzzy
msgid "Cannot save new password."
-msgstr "à°\95à±\8aà°¤à±\8dà°¤ à°¸à°\82à°\95à±\87తపదానà±\8dని à°à°¦à±\8dరపరà°\9aà°²à±\87à°®à±\81."
+msgstr "à°\95à±\8aà°¤à±\8dà°¤ à°¸à°\82à°\95à±\87తపదానà±\8dని à°à°¦à±\8dరపరà°\9aà°²à±\87à°\95à±\81à°¨à±\8dనాà°\82."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "సంకేతపదం భద్రమయ్యింది."
msgid "Server"
msgstr "సేవకి"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr ""
msgid "Path"
msgstr "త్రోవ"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "సైటు అలంకారం"
msgid "Locale directory"
msgstr "అలంకార సంచయం"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr ""
msgid "Fancy URLs"
msgstr ""
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "అలంకారం"
#. TRANS: Fieldset legend in Paths admin panel.
#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSLని ఉపయోగించు"
msgid "People search"
msgstr "వ్యక్తుల అన్వేషణ"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Not a valid people tag: %s."
msgstr "సరైన ఈమెయిల్ చిరునామా కాదు:"
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "%2$sలో %1$s అనే ట్యాగుతో ఉన్న నోటీసులు!"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "మీరు వాడుకరులని తొలగించలేరు."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "అటువంటి పేజీ లేదు."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "ప్లగిన్లు"
msgid "Default plugins"
msgstr "అప్రమేయ భాష"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "తప్పుడు దస్త్రపుపేరు.."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
-#, fuzzy, php-format
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
+#, php-format
msgid "Invalid tag: \"%s\"."
-msgstr "తపà±\8dà°ªà±\81à°¡à±\81 మారà±\81à°ªà±\87à°°ు: \"%s\""
+msgstr "à°\9aà±\86à°²à±\8dలని à°\9fà±\8dయాà°\97ు: \"%s\""
#. TRANS: Server error thrown when user profile settings could not be updated to
#. TRANS: automatically subscribe to any subscriber.
msgid "Restore account"
msgstr "ఖాతాని సృష్టించుకోండి"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr ""
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
#, fuzzy
msgid "Could not retrieve public stream."
msgstr "మారుపేర్లని సృష్టించలేకపోయాం."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "ప్రజా కాలరేఖ, పేజీ %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "ప్రజా కాలరేఖ"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "ప్రజా వాహిని ఫీడు (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "ప్రజా వాహిని ఫీడు (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "ప్రజా వాహిని ఫీడు (ఆటమ్)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, fuzzy, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr "ఇది %s మరియు మిత్రుల కాలరేఖ కానీ ఇంకా ఎవరూ ఏమీ రాయలేదు."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr "[ఖాతా నమోదు చేసుకుని](%%action.register%%) మొదటగా వ్రాసేది మీరే ఎందుకు కాకూడదు!"
-#, fuzzy, php-format
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
+#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"blogging) service based on the Free Software [StatusNet](http://status.net/) "
"tool. [Join now](%%action.register%%) to share notices about yourself with "
"friends, family, and colleagues! ([Read more](%%doc.help%%))"
msgstr ""
-"**%s** అనేది [స్టేటస్నెట్](http://status.net/) అనే స్వేచ్ఛా ఉపకరణ అధారిత [సూక్ష్మ-బ్లాగింగు]"
-"(http://en.wikipedia.org/wiki/Micro-blogging) సేవ అయిన %%%%site.name%%%%లో ఒక "
-"వాడుకరి గుంపు.\n"
-"దీని సభ్యులు వారి జీవితం మరియు ఆసక్తుల గురించి చిన్న సందేశాలని పంచుకుంటారు. ఈ గుంపు మరియు ఇంకా "
-"చాల వాటిలో భాగస్తులవ్వడానికి [ఇప్పుడే చేరండి](%%%%action.register%%%%)! ([మరింత చదవండి](%%%%"
-"doc.help%%%%))"
+"ఇది %%site.name%%, [స్టేటస్నెట్](http://status.net/) అనే స్వేచ్ఛా ఉపకరణ అధారిత [సూక్ష్మ-"
+"బ్లాగింగు](http://en.wikipedia.org/wiki/Micro-blogging) సేవ. మీ సంగతులను మీ "
+"మిత్రులతో, కుటుంబంతో మరియు సహోద్యోగులతో పంచుకోడానికి [ఇప్పుడే చేరండి](%%action.register%%)! "
+"([మరింత తెలుసుకోండి](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"ఆధారపడిన ఒక [మైక్రో-బ్లాగింగు](http://en.wikipedia.org/wiki/Micro-blogging) సేవ."
#. TRANS: Public RSS feed description. %s is the StatusNet site name.
-#, fuzzy, php-format
+#, php-format
msgid "%s updates from everyone."
-msgstr "అందరి నుండి %s తాజాకరణలు!"
+msgstr "అందరి నుండి %s తాజాకరణలు."
#. TRANS: Title for public tag cloud.
msgid "Public tag cloud"
msgid "No id parameter"
msgstr "జోడింపులు లేవు."
-#, fuzzy, php-format
+#, php-format
msgid "No such file \"%d\""
-msgstr "అటువంటి ఫైలు లేదు."
+msgstr "\"%d\" అనే దస్త్రం లేదు"
msgid "Sorry, only invited people can register."
msgstr "క్షమించండి, ఆహ్వానితులు మాత్రమే నమోదుకాగలరు."
msgid "Longer name, preferably your \"real\" name."
msgstr "పొడుగాటి పేరు, మీ \"అసలు\" పేరైతే మంచిది"
-#, fuzzy
msgid "Where you are, like \"City, State (or Region), Country\"."
-msgstr "మీరు ఎక్కడ నుండి, \"నగరం, రాష్ట్రం (లేదా ప్రాంతం), దేశం\""
+msgstr "మీరు ఎక్కడివారు, \"నగరం, రాష్ట్రం (లేదా ప్రాంతం), దేశం\"."
#, php-format
msgid ""
msgid "Subscribe"
msgstr "చందాచేరు"
-#, fuzzy
msgid "Invalid profile URL (bad format)."
-msgstr "à°ªà±\8dà°°à±\8aà°ªà±\88à°²à±\8d URL తపà±\8dà°ªà±\81 (à°\9aà±\86à°¡à±\81 ఫారà±\8dమాà°\9fà±\8d)"
+msgstr "à°ªà±\8dà°°à±\8aà°ªà±\88à°²à±\8d URL తపà±\8dà°ªà±\81 (à°\9aà±\86à°²à±\8dలని ఫారà±\8dమాà°\9fà±\8d)."
msgid "Not a valid profile URL (no YADIS document or invalid XRDS defined)."
msgstr ""
msgid "You already repeated that notice."
msgstr "మీరు ఇప్పటికే ఆ నోటీసుని పునరావృతించారు."
-#, fuzzy
msgid "Repeated"
-msgstr "à°¸à±\83à°·à±\8dà°\9fà°¿తం"
+msgstr "à°ªà±\81నరావà±\83తం"
msgid "Repeated!"
msgstr "పునరావృతించారు!"
msgstr ""
#. TRANS: Title for submit button to confirm upload of a user backup file for account restore.
-#, fuzzy
msgid "Upload the file"
-msgstr "à°«à±\88à°²à±\81ని à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà±\81"
+msgstr "à°\88 దసà±\8dà°¤à±\8dరానà±\8dని à°\8eà°\95à±\8dà°\95à°¿à°\82à°\9aà°\82à°¡à°¿"
msgid "You cannot revoke user roles on this site."
msgstr "ఈ సైటులో మీరు వాడుకరలకి పాత్రలను ఇవ్వలేరు."
msgid "%1$s group, page %2$d"
msgstr "%1$s గుంపు , %2$dవ పేజీ"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "గమనిక"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "మారుపేర్లు"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "గుంపు చర్యలు"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "నోటీసుని తొలగించాం."
+#, fuzzy
+msgid "Notice"
+msgstr "సందేశాలు"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "ట్యాగులు"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "వాడుకరి ప్రొఫైలు"
msgstr "ట్యాగులు"
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "తప్పుడు మారుపేరు: \"%s\""
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’."
msgstr ""
-#, fuzzy
msgid "URL settings"
-msgstr "IM అమరికలు"
+msgstr "URL అమరికలు"
#. TRANS: Instructions for tab "Other" in user profile settings.
msgid "Manage various other options."
msgstr "వాడుకరులను కొత్త వారిని ఆహ్వానించడానికి అనుమతించాలా వద్దా."
#. TRANS: Title for button to save user settings in user admin panel.
-#, fuzzy
msgid "Save user settings."
-msgstr "వాడుకరి అమరికలను భద్రపరచు"
+msgstr "వాడుకరి అమరికలను భద్రపరచు."
#. TRANS: Page title.
msgid "Authorize subscription"
msgid "Enjoy your hotdog!"
msgstr ""
-#, fuzzy
msgid "Design settings"
-msgstr "à°¸à±\88à°\9fà±\81 à°\85మరిà°\95లనà±\81 à°à°¦à±\8dరపరà°\9aు"
+msgstr "à°°à±\82à°ªà±\81à°°à±\87à°\96à°² à°\85మరిà°\95à°²ు"
msgid "View profile designs"
msgstr "ఫ్రొఫైలు రూపురేఖలు"
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "ప్లగిన్లు"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "పేరు"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "వాడుకరి చర్యలు"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "వాడుకరి తొలగింపు కొనసాగుతూంది..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "ఫ్రొఫైలు అమరికలని మార్చు"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "మార్చు"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "ఈ వాడుకరికి ఒక నేరు సందేశాన్ని పంపించండి"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "సందేశం"
+
+#. TRANS: Label text on user profile to select a user role.
+#, fuzzy
+msgid "Moderate"
+msgstr "సమన్వయకర్త"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "వాడుకరి పాత్ర"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "నిర్వాహకులు"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "సమన్వయకర్త"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgstr "మరింత చూపించు"
#. TRANS: Inline reply form submit button: submits a reply comment.
-#, fuzzy
msgctxt "BUTTON"
msgid "Reply"
msgstr "స్పందించండి"
#. TRANS: Placeholder text for inline reply form. Clicking in this box will turn it into a mini notice form.
msgid "Write a reply..."
-msgstr ""
+msgstr "మీ స్పందనని వ్రాయండి..."
-#, fuzzy
msgid "Status"
-msgstr "à°¸à±\8dà°\9fà±\87à°\9fà°¸à±\8dâ\80\8cà°¨à±\86à°\9fà±\8d"
+msgstr "à°¸à±\8dథితి"
#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set.
#. TRANS: Text between [] is a link description, text between () is the link itself.
msgid "Unable to delete design setting."
msgstr "మీ రూపురేఖల అమరికలని భద్రపరచలేకున్నాం."
+msgid "Home"
+msgstr "ముంగిలి"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "ప్రాథమిక సైటు స్వరూపణం"
msgstr ""
#. TRANS: Title.
-#, fuzzy
msgid "Tags for this attachment"
-msgstr "à°\85à°\9fà±\81à°µà°\82à°\9fà°¿ à°\9cà±\8bà°¡à°¿à°\82à°ªà±\81 à°²à±\87à°¦à±\81."
+msgstr "à°\88 à°\9cà±\8bà°¡à°¿à°\82à°ªà±\81à°\95à°¿ à°\9fà±\8dయాà°\97à±\81à°²à±\81"
#. TRANS: Exception thrown when a password change fails.
-#, fuzzy
msgid "Password changing failed."
-msgstr "à°¸à°\82à°\95à±\87తపదà°\82 మారà±\8dà°ªà±\81 విఫలమà±\88à°\82ది"
+msgstr "à°¸à°\82à°\95à±\87తపదపà±\81 మారà±\8dà°ªà±\81 విఫలమà±\88à°\82ది."
#. TRANS: Exception thrown when a password change attempt fails because it is not allowed.
msgid "Password changing is not allowed."
msgstr[0] "మీరు ఇప్పటికే లోనికి ప్రవేశించారు!"
msgstr[1] "మీరు ఇప్పటికే లోనికి ప్రవేశించారు!"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "ఆదేశ ఫలితాలు"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "మీ నోటీసుని మీరే పునరావృతించలేరు."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "మీ నోటీసుని మీరే పునరావృతించలేరు."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "ఈ వాడుకరికి చందాచేరు"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "ఈ వాడుకరి నుండి చందామాను"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "%s కి నేరు సందేశాలు"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "ప్రొఫైలు సమాచారం"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "ఈ నోటీసుని పునరావృతించు"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "ఈ నోటీసుపై స్పందించండి"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "గుర్తుతెలియని గుంపు."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "గుంపు తొలగింపు"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "క్షమించండి, ఈ ఆదేశం ఇంకా అమలుపరచబడలేదు."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr ""
-msgid "Home"
-msgstr "ముంగిలి"
-
msgid "Public"
msgstr "ప్రజా"
msgid "Select tag to filter"
msgstr ""
-#, fuzzy
msgid "Tag"
-msgstr "ట్యాగులు"
+msgstr "ట్యాగు"
msgid "Choose a tag to narrow list"
msgstr ""
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "గుంపు యొక్క ప్రాంతం, ఉంటే, \"నగరం, రాష్ట్రం (లేదా ప్రాంతం), దేశం\""
+msgid "Aliases"
+msgstr "మారుపేర్లు"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "గుంపు చర్యలు"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "ఎక్కువమంది సభ్యులున్న గుంపులు"
msgid "Notice repeated"
msgstr "నోటీసుని పునరావృతించారు"
+msgid "Update your status..."
+msgstr ""
+
#, fuzzy
msgid "Nudge this user"
msgstr "ఈ వాడుకరిని తొలగించు"
msgid "Change your personal settings"
msgstr "ఫ్రొఫైలు అమరికలని మార్చు"
-#, fuzzy
msgid "Site configuration"
-msgstr "వాడà±\81à°\95à°°à°¿ స్వరూపణం"
+msgstr "à°¸à±\88à°\9fà±\81 స్వరూపణం"
msgid "Logout"
msgstr "నిష్క్రమించు"
msgstr "ఏమీలేదు"
#. TRANS: Server exception displayed if a theme name was invalid.
-#, fuzzy
msgid "Invalid theme name."
-msgstr "తపà±\8dà°ªà±\81à°¡à±\81 దసà±\8dà°¤à±\8dà°°à°ªà±\81à°ªà±\87à°°à±\81.."
+msgstr "à°\9aà±\86à°²à±\8dలని à°\85à°²à°\82à°\95ారపà±\81 à°ªà±\87à°°à±\81."
msgid "This server cannot handle theme uploads without ZIP support."
msgstr ""
msgid "The theme file is missing or the upload failed."
msgstr ""
-#, fuzzy
msgid "Failed saving theme."
-msgstr "à°\85వతారపà±\81 తాà°\9cà°¾à°\95à°°à°£ విఫలమైంది."
+msgstr "à°\85à°²à°\82à°\95ారానà±\8dని à°à°¦à±\8dరపరà°\9aà°¡à°\82 విఫలమైంది."
msgid "Invalid theme: bad directory structure."
msgstr ""
msgid "User %1$s (%2$d) has no profile record."
msgstr "వాడుకరికి ప్రొఫైలు లేదు."
-msgid "Edit Avatar"
-msgstr "అవతారాన్ని మార్చు"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "వాడుకరి చర్యలు"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "వాడుకరి తొలగింపు కొనసాగుతూంది..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "ఫ్రొఫైలు అమరికలని మార్చు"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "మార్చు"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "ఈ వాడుకరికి ఒక నేరు సందేశాన్ని పంపించండి"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "సందేశం"
-
-#. TRANS: Label text on user profile to select a user role.
-#, fuzzy
-msgid "Moderate"
-msgstr "సమన్వయకర్త"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "వాడుకరి పాత్ర"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "నిర్వాహకులు"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "సమన్వయకర్త"
-
-#, fuzzy
msgid "Not allowed to log in."
-msgstr "à°²à±\8bనిà°\95à°¿ à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aలేదు."
+msgstr "à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aడానిà°\95à°¿ à°\85à°¨à±\81మతి లేదు."
#. TRANS: Used in notices to indicate when the notice was made compared to now.
msgid "a few seconds ago"
#. TRANS: Web color exception thrown when a hexadecimal color code does not validate.
#. TRANS: %s is the provided (invalid) color code.
-#, fuzzy, php-format
+#, php-format
msgid "%s is not a valid color! Use 3 or 6 hex characters."
msgstr "%s అనేది సరైన రంగు కాదు! 3 లేదా 6 హెక్స్ అక్షరాలను వాడండి."
#. TRANS: Exception.
-#, fuzzy
msgid "Invalid XML."
-msgstr "తపà±\8dà°ªà±\81à°¡à±\81 పరిమాణà°\82."
+msgstr "à°\9aà±\86à°²à±\8dలని XML."
#. TRANS: Exception.
msgid "Invalid XML, missing XRD root."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s కాలరేఖ"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "ఈ సైటులోని వ్యక్తులని కనుగొనండి"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "తప్పుడు మారుపేరు: \"%s\""
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:33+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:22+0000\n"
"Language-Team: Turkish <http://translatewiki.net/wiki/Portal:tr>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: tr\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "%s kullanıcısının grupları"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%2$s kullanıcısının üye olduğu %1$s grupları."
#. TRANS: Client exception thrown when trying favorite a notice without content.
#, fuzzy
-msgid "Unknown note."
+msgid "Unknown notice."
msgstr "Böyle bir durum mesajı yok."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Eposta onayı silinemedi."
+#, fuzzy
+msgid "Invalid image."
+msgstr "Geçersiz büyüklük."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Yeni grup"
msgid "This is your outbox, which lists private messages you have sent."
msgstr ""
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "Parolayı değiştir"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Parolanızı değiştirin."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Parola değiştirildi"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Eski parola"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Yeni parola"
+#. TRANS: Field title on page where to change password.
#, fuzzy
msgid "6 or more characters."
msgstr "6 veya daha fazla karakter"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Onayla"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
#, fuzzy
msgid "Same as password above."
msgstr "yukarıdaki parolanın aynısı"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "Değiştir"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Parola 6 veya daha fazla karakterden oluşmalıdır."
msgid "Passwords don't match."
msgstr "Parolalar birbirini tutmuyor."
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "Eski parola yanlış"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Kullanıcıyı kaydetmede hata oluştu; geçersiz."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
#, fuzzy
msgid "Cannot save new password."
msgstr "Yeni parola kaydedilemedi."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Parola kaydedildi."
msgid "Server"
msgstr "Sunucu"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr ""
msgid "Path"
msgstr "Yol"
+#. TRANS: Field title in Paths admin panel.
#, fuzzy
msgid "Site path."
msgstr "Site yolu"
msgid "Locale directory"
msgstr "Avatar güncellendi."
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr ""
msgid "Fancy URLs"
msgstr ""
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr ""
+#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "Theme"
msgstr ""
msgstr ""
#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "SSL"
msgstr ""
msgid "People search"
msgstr "Kişi Arama"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Not a valid people tag: %s."
msgstr "Geçersiz bir eposta adresi."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, fuzzy, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "%s adli kullanicinin durum mesajlari"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr ""
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "Kullanıcıları silemezsiniz."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "Böyle bir sayfa yok."
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Eklentiler"
msgid "Default plugins"
msgstr "Öntanımlı dil"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Geçersiz büyüklük."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr ""
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, fuzzy, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Geçersiz büyüklük."
msgid "Restore account"
msgstr "Bir hesap oluştur"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr ""
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
#, fuzzy
msgid "Could not retrieve public stream."
msgstr "Kullanıcı güncellenemedi."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, fuzzy, php-format
msgid "Public timeline, page %d"
msgstr "Genel zaman çizgisi"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Genel zaman çizgisi"
+#. TRANS: Link description for public timeline feed.
#, fuzzy
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Genel Durum Akış RSS Beslemesi"
+#. TRANS: Link description for public timeline feed.
#, fuzzy
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Genel Durum Akış RSS Beslemesi"
+#. TRANS: Link description for public timeline feed.
#, fuzzy
msgid "Public Stream Feed (Atom)"
msgstr "Genel Durum Akış RSS Beslemesi"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr ""
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr ""
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"friends, family, and colleagues! ([Read more](%%doc.help%%))"
msgstr ""
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Bütün abonelikler"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Not"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Diğerisimler"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr ""
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, fuzzy, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Durum mesajı silindi."
+#, fuzzy
+msgid "Notice"
+msgstr "Durum mesajları"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, fuzzy, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr ""
-#. TRANS: H2 for user profile information.
#, fuzzy
msgid "User profile"
msgstr "Kullanıcının profili yok."
msgid "Tag user"
msgstr "Kullanıcıyı etiketle"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
-
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Geçersiz büyüklük."
+"Kendiniz için etiketler (harf, sayı, -. ., ve _ kullanılabilir), virgül veya "
+"boşlukla ayırabilirsiniz"
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
"along with this program. If not, see %s."
msgstr ""
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Eklentiler"
+
#. TRANS: Form input field label for application name.
#, fuzzy
msgid "Name"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr ""
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+#, fuzzy
+msgid "Edit profile settings"
+msgstr "Profil ayarları"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr ""
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr ""
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr ""
+
+#. TRANS: Label text on user profile to select a user role.
+#, fuzzy
+msgid "User role"
+msgstr "Kullanıcının profili yok."
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr ""
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr ""
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, fuzzy, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "Dizayn ayarı silinemedi."
+msgid "Home"
+msgstr "Başlangıç Sayfası"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Temel site yapılandırması"
msgid_plural "You are a member of these groups:"
msgstr[0] "Bize o profili yollamadınız"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on"
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "off"
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Bize o profili yollamadınız"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Bize o profili yollamadınız"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "%s kullanıcısına özel mesaj"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Profil ayarları"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Böyle bir durum mesajı yok."
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Böyle bir kullanıcı yok."
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Yeni grup"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Kullanıcıyı sil"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "showForm() gerçeklenmemiş."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "Database error"
msgstr ""
-msgid "Home"
-msgstr "Başlangıç Sayfası"
-
msgid "Public"
msgstr "Genel"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "Bulunduğunuz yer, \"Şehir, Eyalet (veya Bölge), Ülke\" gibi"
+msgid "Aliases"
+msgstr "Diğerisimler"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr ""
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr ""
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr ""
msgid "Notice repeated"
msgstr "Durum mesajları"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr ""
msgid "User %1$s (%2$d) has no profile record."
msgstr "Kullanıcının profili yok."
-#, fuzzy
-msgid "Edit Avatar"
-msgstr "Avatar"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr ""
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-#, fuzzy
-msgid "Edit profile settings"
-msgstr "Profil ayarları"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr ""
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr ""
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr ""
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr ""
-
-#. TRANS: Label text on user profile to select a user role.
-#, fuzzy
-msgid "User role"
-msgstr "Kullanıcının profili yok."
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr ""
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr ""
-
#, fuzzy
msgid "Not allowed to log in."
msgstr "Giriş yapılmadı."
msgid "Getting backup from file '%s'."
msgstr ""
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s zaman çizelgesi"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "Siteye giriş"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Geçersiz büyüklük."
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:34+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:23+0000\n"
"Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: uk\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "Спільноти %s"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "Спільноти на %1$s, до яких долучився %2$s."
msgstr "Можна лише додавати дописи до обраних."
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
-msgstr "Ð\9dевÑ\96дома пÑ\80имÑ\96Ñ\82ка"
+msgid "Unknown notice."
+msgstr "Ð\9dевÑ\96домий допиÑ\81."
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
msgid "Already a favorite."
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "Не вдалося створити додаток."
+msgid "Invalid image."
+msgstr "Неприпустиме зображення."
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "Нова спільнота"
"Це ваші вихідні повідомлення, тут містяться повідомлення, які ви надіслали "
"приватно."
+#. TRANS: Title for page where to change password.
+msgctxt "TITLE"
msgid "Change password"
msgstr "Змінити пароль"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "Змінити пароль."
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "Пароль замінено"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "Старий пароль"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "Новий пароль"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "6 або більше знаків."
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "Підтвердити"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "Такий само, як і пароль вище."
+#. TRANS: Button text on page where to change password.
+msgctxt "BUTTON"
msgid "Change"
msgstr "Змінити"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "Пароль має складатись з 6-ти або більше знаків."
msgid "Passwords don't match."
msgstr "Паролі не співпадають."
-msgid "Incorrect old password"
-msgstr "Старий пароль є неточним"
+#. TRANS: Form validation error on page where to change password.
+msgid "Incorrect old password."
+msgstr "Неправильний старий пароль."
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "Помилка при збереженні користувача; недійсний."
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
msgid "Cannot save new password."
msgstr "Не вдається зберегти новий пароль."
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "Пароль збережено."
msgid "Server"
msgstr "Сервер"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "Ім’я хосту сервера на якому знаходиться сайт."
msgid "Path"
msgstr "Шлях"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "Шлях до сайту."
msgid "Locale directory"
msgstr "Директорія локалі"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "Шлях до директорії локалей."
msgid "Fancy URLs"
msgstr "Надзвичайні URL-адреси"
-msgid "Use fancy (more readable and memorable) URLs?"
-msgstr "Використовувати надзвичайні (найбільш пам’ятні і визначні) URL-адреси?"
+#. TRANS: Field title in Paths admin panel.
+msgid "Use fancy URLs (more readable and memorable)?"
+msgstr ""
+"Використовувати короткі (що їх легше прочитати і запам’ятати) URL-адреси?"
+#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "Theme"
msgstr "Тема"
msgstr "Директорія, в якій знаходяться вкладення."
#. TRANS: Fieldset legend in Paths admin panel.
+msgctxt "LEGEND"
msgid "SSL"
-msgstr "SSL-шифрування"
+msgstr "SSL"
#. TRANS: Drop down option in Paths admin panel (option for "When to use SSL").
msgid "Never"
msgid "People search"
msgstr "Пошук людей"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "Це недійсний особистий теґ: %s."
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "Користувачі з особистим теґом «%1$s» — сторінка %2$d"
msgid "Disabled"
msgstr "Вимкнений"
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "Ця дія приймає лише запити POST."
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
msgid "You cannot administer plugins."
msgstr "Ви не можете керувати додатками."
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
msgid "No such plugin."
msgstr "Немає такого додатку."
msgstr "Увімкнений"
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+msgctxt "TITLE"
msgid "Plugins"
msgstr "Додатки"
msgid "Default plugins"
msgstr "Додатки за замовчуванням"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
"Всі додатки за замовчуванням було вимкнено у файлі конфігурації даного сайту."
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "Недійсний зміст допису."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "Ліцензія допису «%1$s» є несумісною з ліцензією сайту «%2$s»."
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Invalid tag: \"%s\"."
msgstr "Неприпустимий теґ: «%s»."
msgid "Restore account"
msgstr "Відновити акаунт"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "Перевищено ліміт сторінки (%s)."
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "Не вдається відновити загальну стрічку."
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "Загальна стрічка, сторінка %d"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "Загальна стрічка"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "Стрічка публічних дописів (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "Стрічка публічних дописів (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "Стрічка публічних дописів (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
msgstr ""
"Це публічна стрічка дописів сайту %%site.name%%, але вона поки що порожня."
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "Станьте першим! Напишіть щось!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
"Чому б не [зареєструватись](%%action.register%%) і не зробити свій перший "
"допис!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"розділити своє життя з друзями, родиною і колегами! ([Дізнатися більше](%%"
"doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "Спільнота %1$s, сторінка %2$d"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "Зауваження"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "Додаткові імена"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "Дії спільноти"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "Допис видалено."
+msgid "Notice"
+msgstr "Дописи"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "Позначити %s"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "Профіль користувача."
msgid "Tag user"
msgstr "Позначити користувача"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"Позначити користувача теґами (літери, цифри, -, . та _), відокремлюючи кожен "
"комою або пробілом"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "Недійсний теґ: «%s»"
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr ""
"Разом з програмою ви маєте отримати копію ліцензійних умов GNU Affero "
"General Public License. Якщо ні, перейдіть на %s."
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "Додатки"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "Ім’я"
msgid "No AtomPub API service for %s."
msgstr "Немає послуги AtomPub API для %s."
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "Діяльність користувача"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "Видалення користувача у процесі..."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "Налаштування профілю"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Правка"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "Надіслати пряме повідомлення цьому користувачеві"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "Повідомлення"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "Модерувати"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "Роль користувача"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "Адміністратор"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "Модератор"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Write a reply..."
msgstr "Пише відповідь..."
-#, fuzzy
msgid "Status"
-msgstr "StatusNet"
+msgstr "Статус"
#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set.
#. TRANS: Text between [] is a link description, text between () is the link itself.
msgid "Unable to delete design setting."
msgstr "Немає можливості видалити налаштування дизайну."
+msgid "Home"
+msgstr "Веб-сторінка"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "Основна конфігурація сайту"
msgstr[1] "Ви є учасником таких спільнот:"
msgstr[2] "Ви є учасником таких спільнот:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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"
-msgstr ""
-"Команди:\n"
-"on — увімкнути сповіщення\n"
-"off — вимкнути сповіщення\n"
-"help — список команд\n"
-"follow <nickname> — підписатись до користувача\n"
-"groups — спільноти, до яких ви входите\n"
-"subscriptions — користувачі, до яких ви підписані\n"
-"subscribers — користувачі, які підписані до вас\n"
-"leave <nickname> — відписатись від користувача\n"
-"d <nickname> <text> — надіслати особисте повідомлення\n"
-"get <nickname> — отримати останній допис користувача\n"
-"whois <nickname> — інфо про користувача\n"
-"fav <nickname> — додати останній допис користувача до обраних\n"
-"fav #<notice_id> — додати допис до обраних\n"
-"reply #<notice_id> — відповісти на допис\n"
-"reply <nickname> — відповісти на останній допис користувача\n"
-"join <group> — приєднатися до спільноти\n"
-"login — отримати посилання входу до веб-інтерфейсу\n"
-"drop <group> — залишити спільноту\n"
-"stats — отримати статистику\n"
-"stop — те саме що і 'off'\n"
-"quit — те саме що і 'off'\n"
-"sub <nickname> — те саме що і 'follow'\n"
-"unsub <nickname> — те саме що і 'leave'\n"
-"last <nickname> — те саме що і 'get'\n"
-"on <nickname> — наразі не виконується\n"
-"off <nickname> — наразі не виконується\n"
-"nudge <nickname> — «розштовхати»\n"
-"invite <phone number> — наразі не виконується\n"
-"track <word> — наразі не виконується\n"
-"untrack <word> — наразі не виконується\n"
-"track off — наразі не виконується\n"
-"untrack all — наразі не виконується\n"
-"tracks — наразі не виконується\n"
-"tracking — наразі не виконується\n"
+#. TRANS: Header line of help text for commands.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "Результати команди"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "Не можна увімкнути сповіщення."
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "Не можна вимкнути сповіщення."
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "Підписатись до цього користувача"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "Відписатись від цього користувача"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "Пряме повідомлення до %s"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "Віддалений профіль не є спільнотою!"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "Повторити цей допис"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "Відповісти на цей допис"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "Невідома спільнота."
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "Видалити спільноту"
+
+#. TRANS: Help message for IM/SMS command "stats"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr "Оновити свій статус..."
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "Виконання команди ще не завершено."
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
+msgstr ""
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "No configuration file found."
msgid "Database error"
msgstr "Помилка бази даних"
-msgid "Home"
-msgstr "Веб-сторінка"
-
msgid "Public"
msgstr "Загал"
msgstr ""
"Розташування спільноти, на кшталт «Місто, область (або регіон), країна»."
+msgid "Aliases"
+msgstr "Додаткові імена"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "Додати або редагувати дизайн %s"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "Дії спільноти"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "Спільноти з найбільшою кількістю учасників"
msgstr "з"
msgid "Can't get author for activity."
-msgstr ""
+msgstr "Не вдається отримати автора для діяльності."
-#, fuzzy
msgid "Bookmark not posted to this group."
-msgstr "Ð\92ам не дозволено видалÑ\8fÑ\82и Ñ\86Ñ\8e Ñ\81пÑ\96лÑ\8cноÑ\82Ñ\83."
+msgstr "Ð\97акладкÑ\83 не додано до Ñ\86Ñ\96Ñ\94Ñ\97 Ñ\81пÑ\96лÑ\8cноÑ\82и."
-#, fuzzy
msgid "Object not posted to this user."
-msgstr "Ð\9dе видалÑ\8fÑ\82и цього користувача."
+msgstr "Ð\9eбâ\80\99Ñ\94кÑ\82 не додано до цього користувача."
msgid "Don't know how to handle this kind of target."
-msgstr ""
+msgstr "Не знаю, як обробити такого роду мету."
#. TRANS: Validation error in form for registration, profile and group settings, etc.
msgid "Nickname cannot be empty."
msgid "Notice repeated"
msgstr "Допис повторили"
+msgid "Update your status..."
+msgstr "Оновити свій статус..."
+
msgid "Nudge this user"
msgstr "«Розштовхати» користувача"
msgid "User %1$s (%2$d) has no profile record."
msgstr "Користувач %1$s (%2$d) не має профілю."
-msgid "Edit Avatar"
-msgstr "Аватара"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "Діяльність користувача"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "Видалення користувача у процесі..."
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "Налаштування профілю"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Правка"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "Надіслати пряме повідомлення цьому користувачеві"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "Повідомлення"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "Модерувати"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "Роль користувача"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "Адміністратор"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "Модератор"
-
msgid "Not allowed to log in."
msgstr "Вхід до системи не дозволено."
msgid "Getting backup from file '%s'."
msgstr "Отримання резервної копії файлу «%s»."
-#~ msgid "Friends timeline"
-#~ msgstr "Стрічка друзів"
-
-#~ msgid "Everyone on this site"
-#~ msgstr "Всі на цьому сайті"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "Недійсний теґ: «%s»"
msgstr ""
"Project-Id-Version: StatusNet - Core\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:35+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:24+0000\n"
"Language-Team: Simplified Chinese <http://translatewiki.net/wiki/Portal:zh-"
"hans>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: zh-hans\n"
"X-Message-Group: #out-statusnet-core\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-POT-Import-Date: 2011-03-06 02:16:47+0000\n"
+"X-POT-Import-Date: 2011-03-17 10:19:27+0000\n"
#. TRANS: Page title for Access admin panel that allows configuring site access.
#. TRANS: Menu item for site administration
msgid "%s's groups"
msgstr "%s 的小组"
-#. TRANS: Used as subtitle in check for group membership. %1$s is a user name, %2$s is the site name.
+#. TRANS: Used as subtitle in check for group membership. %1$s is the site name, %2$s is a user name.
#, php-format
msgid "%1$s groups %2$s is a member of."
msgstr "%1$s 的小组,%2$s 是小组成员。"
msgstr "可以只为心目中的绝对通知书。"
#. TRANS: Client exception thrown when trying favorite a notice without content.
-msgid "Unknown note."
+#, fuzzy
+msgid "Unknown notice."
msgstr "未知的注意。"
#. TRANS: Client exception thrown when trying favorite an already favorited notice.
#. TRANS: Client error displayed trying to create a new direct message while not logged in.
#. TRANS: Client error displayed trying to send a notice while not logged in.
#. TRANS: Client error displayed trying to nudge a user without being logged in.
+#. TRANS: Client error displayed when trying to enable or disable a plugin while not logged in.
#. TRANS: Client error displayed trying a change a subscription while not logged in.
#. TRANS: Client error displayed trying to subscribe when not logged in.
#. TRANS: Client error message thrown when trying to access the admin panel while not logged in.
msgid "Could not create application."
msgstr "无法创建应用。"
+#, fuzzy
+msgid "Invalid image."
+msgstr "大小不正确。"
+
#. TRANS: Title for form to create a group.
msgid "New group"
msgstr "新小组"
msgid "This is your outbox, which lists private messages you have sent."
msgstr "这是你的发件箱,包含你发送的私信。"
+#. TRANS: Title for page where to change password.
+#, fuzzy
+msgctxt "TITLE"
msgid "Change password"
msgstr "修改密码"
+#. TRANS: Instructions for page where to change password.
msgid "Change your password."
msgstr "修改你的密码"
+#. TRANS: Fieldset legend on page where to change password.
#. TRANS: Fieldset legend for password reset form.
msgid "Password change"
msgstr "修改密码"
+#. TRANS: Field label on page where to change password.
msgid "Old password"
msgstr "旧密码"
+#. TRANS: Field label on page where to change password.
#. TRANS: Field label for password reset form.
msgid "New password"
msgstr "新密码"
+#. TRANS: Field title on page where to change password.
msgid "6 or more characters."
msgstr "6 个或更多字符"
+#. TRANS: Field label on page where to change password. In this field the new password should be typed a second time.
+#, fuzzy
+msgctxt "LABEL"
+msgid "Confirm"
+msgstr "密码确认"
+
+#. TRANS: Field title on page where to change password.
#. TRANS: Ttile for field label for password reset form where the password has to be typed again.
msgid "Same as password above."
msgstr "与上面相同的密码"
+#. TRANS: Button text on page where to change password.
+#, fuzzy
+msgctxt "BUTTON"
msgid "Change"
msgstr "修改"
+#. TRANS: Form validation error on page where to change password.
msgid "Password must be 6 or more characters."
msgstr "密码必须包含 6 个或更多字符。"
msgid "Passwords don't match."
msgstr "密码不匹配。"
-msgid "Incorrect old password"
+#. TRANS: Form validation error on page where to change password.
+#, fuzzy
+msgid "Incorrect old password."
msgstr "旧密码不正确"
+#. TRANS: Form validation error on page where to change password.
msgid "Error saving user; invalid."
msgstr "保存用户时出错;无效。"
+#. TRANS: Server error displayed on page where to change password when password change
+#. TRANS: could not be made because of a server error.
#. TRANS: Reset password form validation error message.
msgid "Cannot save new password."
msgstr "无法保存新密码。"
+#. TRANS: Form validation notice on page where to change password.
msgid "Password saved."
msgstr "密码已保存。"
msgid "Server"
msgstr "服务器"
+#. TRANS: Field title in Paths admin panel.
msgid "Site's server hostname."
msgstr "网站的服务器主机名。"
msgid "Path"
msgstr "路径"
+#. TRANS: Field title in Paths admin panel.
msgid "Site path."
msgstr "网站路径"
msgid "Locale directory"
msgstr "本地化目录"
+#. TRANS: Field title in Paths admin panel.
msgid "Directory path to locales."
msgstr "本地化文件的目录路径"
msgid "Fancy URLs"
msgstr "优化 URLs"
-msgid "Use fancy (more readable and memorable) URLs?"
+#. TRANS: Field title in Paths admin panel.
+#, fuzzy
+msgid "Use fancy URLs (more readable and memorable)?"
msgstr "使用优化的 URLs(更简洁易记)?"
+#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "Theme"
msgstr "主题"
msgstr "附件文件的目录。"
#. TRANS: Fieldset legend in Paths admin panel.
+#, fuzzy
+msgctxt "LEGEND"
msgid "SSL"
msgstr "SSL"
msgid "People search"
msgstr "搜索用户"
+#. TRANS: Client error displayed when trying to tag a profile with an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Not a valid people tag: %s."
msgstr "不是有效的标签:%s。"
+#. TRANS: Page title for users with a certain self-tag.
+#. TRANS: %1$s is the tag, %2$s is the page number.
#, php-format
msgid "Users self-tagged with %1$s - page %2$d"
msgstr "用户自加标签%s - 第%d 页"
msgid "Disabled"
msgstr ""
+#. TRANS: Client error displayed when trying to use another method than POST.
+#. TRANS: Do not translate POST.
#. TRANS: Client error displayed trying to perform any request method other than POST.
#. TRANS: Do not translate POST.
msgid "This action only accepts POST requests."
msgstr "这个动作只接受 POST 请求"
+#. TRANS: Client error displayed when trying to enable or disable a plugin without access rights.
#, fuzzy
msgid "You cannot administer plugins."
msgstr "你不能删除用户。"
+#. TRANS: Client error displayed when trying to enable or disable a non-existing plugin.
#, fuzzy
msgid "No such plugin."
msgstr "没有这个页面。"
msgstr ""
#. TRANS: Tab and title for plugins admin panel.
-#. TRANS: Menu item for site administration
+#, fuzzy
+msgctxt "TITLE"
msgid "Plugins"
msgstr "插件"
msgid "Default plugins"
msgstr "默认语言"
+#. TRANS: Text displayed on plugin admin page when no plugin are enabled.
msgid ""
"All default plugins have been disabled from the site's configuration file."
msgstr ""
+#. TRANS: Client error displayed if the notice posted has too many characters.
msgid "Invalid notice content."
msgstr "无效的消息内容。"
-#, php-format
-msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’."
+#. TRANS: Exception thrown if a notice's license is not compatible with the StatusNet site license.
+#. TRANS: %1$s is the notice license, %2$s is the StatusNet site's license.
+#, fuzzy, php-format
+msgid "Notice license \"%1$s\" is not compatible with site license \"%2$s\"."
msgstr "消息许可证“%1$s”与这个网站的许可证“%2$s”不兼容。"
#. TRANS: Page title for profile settings.
#. TRANS: Validation error in form for profile settings.
#. TRANS: %s is an invalid tag.
+#. TRANS: Form validation error when entering an invalid tag.
+#. TRANS: %s is the invalid tag.
#, php-format
msgid "Invalid tag: \"%s\"."
msgstr "无效的标记: %s。"
msgid "Restore account"
msgstr "还原账户"
+#. TRANS: Client error displayed when requesting a public timeline page beyond the page limit.
+#. TRANS: %s is the page limit.
#, php-format
msgid "Beyond the page limit (%s)."
msgstr "超出页面限制(%s)。"
+#. TRANS: Server error displayed when a public timeline cannot be retrieved.
msgid "Could not retrieve public stream."
msgstr "无法获取到公共的时间线。"
+#. TRANS: Title for all public timeline pages but the first.
+#. TRANS: %d is the page number.
#, php-format
msgid "Public timeline, page %d"
msgstr "公共时间线,第%d页"
+#. TRANS: Title for the first public timeline page.
msgid "Public timeline"
msgstr "公共时间线"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 1.0)"
msgstr "公开的 RSS 聚合 (RSS 1.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (RSS 2.0)"
msgstr "公开的 RSS 聚合 (RSS 2.0)"
+#. TRANS: Link description for public timeline feed.
msgid "Public Stream Feed (Atom)"
msgstr "公开的 RSS 聚合 (Atom)"
+#. TRANS: Text displayed for public feed when there are no public notices.
#, php-format
msgid ""
"This is the public timeline for %%site.name%% but no one has posted anything "
"yet."
msgstr "这是%%site.name%%的公共时间线,但是还没有人发布任何内容。"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a logged in user.
msgid "Be the first to post!"
msgstr "成为第一个发布消息的人!"
+#. TRANS: Additional text displayed for public feed when there are no public notices for a not logged in user.
#, php-format
msgid ""
"Why not [register an account](%%action.register%%) and be the first to post!"
msgstr "现在就 [注册](%%action.register%%) 并成为第一个发布消息的人!"
+#. TRANS: Message for not logged in users at an invite-only site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
"务。[现在加入](%%action.register%%) 并与你的朋友、家人和同事们一起分享你的消"
"息。([查看更多](%%doc.help%%))"
+#. TRANS: Message for not logged in users at a closed site trying to view the public feed of notices.
+#. TRANS: This message contains Markdown links. Please mind the formatting.
#, php-format
msgid ""
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
msgid "%1$s group, page %2$d"
msgstr "%1$s小组,第%2$d页"
-#. TRANS: Label for group description or group note (dt). Text hidden by default.
-msgid "Note"
-msgstr "注释"
-
-#. TRANS: Label for group aliases (dt). Text hidden by default.
-msgid "Aliases"
-msgstr "别名"
-
-#. TRANS: Group actions header (h2). Text hidden by default.
-msgid "Group actions"
-msgstr "小组动作"
-
#. TRANS: Tooltip for feed link. %s is a group nickname.
#, php-format
msgid "Notice feed for %s group (RSS 1.0)"
msgid "Notice deleted."
msgstr "消息已删除"
+msgid "Notice"
+msgstr "消息"
+
#. TRANS: Page title showing tagged notices in one user's stream. %1$s is the username, %2$s is the hash tag.
#, php-format
msgid "%1$s tagged %2$s"
msgid "Tag %s"
msgstr "将%s加为标签"
-#. TRANS: H2 for user profile information.
msgid "User profile"
msgstr "用户页面"
msgid "Tag user"
msgstr "将用户加为标签"
+#, fuzzy
msgid ""
-"Tags for this user (letters, numbers, -, ., and _), comma- or space- "
-"separated"
+"Tags for this user (letters, numbers, -, ., and _), separated by commas or "
+"spaces."
msgstr ""
"给这个用户加注标签 (字母letters, 数字numbers, -, ., and _), 逗号或空格分隔"
-#, php-format
-msgid "Invalid tag: \"%s\""
-msgstr "无效的标签:\"%s\"。"
-
msgid ""
"You can only tag people you are subscribed to or who are subscribed to you."
msgstr "你只能给你关注或关注你的人添加标签。"
"along with this program. If not, see %s."
msgstr "你应该在本程序中收到了一份 GNU Affero GPL 的副本,如果没有收到请看%s。"
+#. TRANS: Menu item for site administration
+msgid "Plugins"
+msgstr "插件"
+
#. TRANS: Form input field label for application name.
msgid "Name"
msgstr "名称"
msgid "No AtomPub API service for %s."
msgstr ""
+#. TRANS: H2 for user actions in a profile.
+#. TRANS: H2 for entity actions in a profile.
+msgid "User actions"
+msgstr "用户动作"
+
+#. TRANS: Text shown in user profile of not yet compeltely deleted users.
+msgid "User deletion in progress..."
+msgstr "用户删除处理中……"
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit profile settings"
+msgstr "编辑个人信息设置"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "编辑"
+
+#. TRANS: Link title for link on user profile.
+msgid "Send a direct message to this user"
+msgstr "给该用户发送私信"
+
+#. TRANS: Link text for link on user profile.
+msgid "Message"
+msgstr "私信"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "Moderate"
+msgstr "审核"
+
+#. TRANS: Label text on user profile to select a user role.
+msgid "User role"
+msgstr "用户权限"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Administrator"
+msgstr "管理员"
+
+#. TRANS: Role that can be set for a user profile.
+msgctxt "role"
+msgid "Moderator"
+msgstr "审核员"
+
#. TRANS: Page title. %1$s is the title, %2$s is the site name.
#, php-format
msgid "%1$s - %2$s"
msgid "Unable to delete design setting."
msgstr "无法删除外观设置。"
+msgid "Home"
+msgstr "主页"
+
#. TRANS: Menu item title/tooltip
msgid "Basic site configuration"
msgstr "基本网站配置"
msgid_plural "You are a member of these groups:"
msgstr[0] "你是该小组成员:"
-#. TRANS: Help text for commands. Do not translate the command names themselves; they are fixed strings.
-msgid ""
-"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"
-"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.
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "Commands:"
+msgstr "执行结果"
+
+#. TRANS: Help message for IM/SMS command "on"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn on notifications"
+msgstr "无法开启通知。"
+
+#. TRANS: Help message for IM/SMS command "off"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "turn off notifications"
+msgstr "无法关闭通知。"
+
+#. TRANS: Help message for IM/SMS command "help"
+msgctxt "COMMANDHELP"
+msgid "show this help"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "follow <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "subscribe to user"
+msgstr "关注这个用户"
+
+#. TRANS: Help message for IM/SMS command "groups"
+msgctxt "COMMANDHELP"
+msgid "lists the groups you have joined"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscriptions"
+msgctxt "COMMANDHELP"
+msgid "list the people you follow"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "subscribers"
+msgctxt "COMMANDHELP"
+msgid "list the people that follow you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "leave <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "unsubscribe from user"
+msgstr "取消关注这个用户"
+
+#. TRANS: Help message for IM/SMS command "d <nickname> <text>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "direct message to user"
+msgstr "发给%s的私信"
+
+#. TRANS: Help message for IM/SMS command "get <nickname>"
+msgctxt "COMMANDHELP"
+msgid "get last notice from user"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "whois <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "get profile info on user"
+msgstr "远程配置文件不是一个组 !"
+
+#. TRANS: Help message for IM/SMS command "lose <nickname>"
+msgctxt "COMMANDHELP"
+msgid "force user to stop following you"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav <nickname>"
+msgctxt "COMMANDHELP"
+msgid "add user's last notice as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "fav #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "add notice with the given id as a 'fave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "repeat a notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "repeat <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "repeat the last notice from user"
+msgstr "转发"
+
+#. TRANS: Help message for IM/SMS command "reply #<notice_id>"
+msgctxt "COMMANDHELP"
+msgid "reply to notice with a given id"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "reply <nickname>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "reply to the last notice from user"
+msgstr "回复"
+
+#. TRANS: Help message for IM/SMS command "join <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "join group"
+msgstr "未知的组。"
+
+#. TRANS: Help message for IM/SMS command "login"
+msgctxt "COMMANDHELP"
+msgid "Get a link to login to the web interface"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "drop <group>"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "leave group"
+msgstr "删除小组"
+
+#. TRANS: Help message for IM/SMS command "stats"
+msgctxt "COMMANDHELP"
+msgid "get your stats"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "stop"
+#. TRANS: Help message for IM/SMS command "quit"
+msgctxt "COMMANDHELP"
+msgid "same as 'off'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "sub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'follow'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "unsub <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'leave'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "last <nickname>"
+msgctxt "COMMANDHELP"
+msgid "same as 'get'"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "on <nickname>"
+#. TRANS: Help message for IM/SMS command "off <nickname>"
+#. TRANS: Help message for IM/SMS command "invite <phone number>"
+#. TRANS: Help message for IM/SMS command "track <word>"
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#, fuzzy
+msgctxt "COMMANDHELP"
+msgid "not yet implemented."
+msgstr "命令尚未实现。"
+
+#. TRANS: Help message for IM/SMS command "nudge <nickname>"
+msgctxt "COMMANDHELP"
+msgid "remind a user to update."
msgstr ""
-"命令:\n"
-"on - 打开提醒\n"
-"off - 关闭提醒\n"
-"help - 显示此帮助\n"
-"follow <昵称> - 关注该用户\n"
-"groups - 列出你加入的小组\n"
-"subscriptions - 列出你关注的用户\n"
-"subscribers - 列出你的关注者\n"
-"leave <昵称> - 取消关注该用户\n"
-"d <昵称> <文字> - 给该用户发送私信\n"
-"get <昵称> - 获取该用户的最后一条消息\n"
-"whois <昵称> - 获取该用户的个人信息\n"
-"lose <昵称> - 强行取消该用户对你的关注\n"
-"fav <昵称> - 将该用户最后一条消息加为'收藏'\n"
-"fav #<消息id> - 将该id的消息加为'收藏'\n"
-"repeat #<消息id> - 转发该id的消息\n"
-"repeat <昵称> - 转发该用户的最后一条消息\n"
-"reply #<消息id> - 对该id消息回复\n"
-"reply <昵称> - 对该用户的最后一条消息回复\n"
-"join <小组> - 加入小组\n"
-"login - 获取网页登录的地址\n"
-"drop <小组> - 离开小组\n"
-"stats - 获取你的统计\n"
-"stop - 和'off'相同\n"
-"quit - 和'off'相同\n"
-"sub <昵称> - 和'follow'相同\n"
-"unsub <昵称> - 和'leave'相同\n"
-"last <昵称> - 和'get'相同\n"
-"on <昵称> - 尚未实现。\n"
-"off <昵称> - 尚未实现。\n"
-"nudge <昵称> - 提醒该用户更新消息。\n"
-"invite <电话号码> - 尚未实现。\n"
-"track <word> - 尚未实现。\n"
-"untrack <word> - 尚未实现。\n"
-"track off - 尚未实现。\n"
-"untrack all - 尚未实现。\n"
-"tracks - 尚未实现。\n"
-"tracking - 尚未实现。\n"
#. TRANS: Error message displayed when no configuration file was found for a StatusNet installation.
msgid "No configuration file found."
msgid "Database error"
msgstr "数据库错误"
-msgid "Home"
-msgstr "主页"
-
msgid "Public"
msgstr "公共"
"Location for the group, if any, like \"City, State (or Region), Country\"."
msgstr "小组的地理位置,例如“国家、省份、城市”。"
+msgid "Aliases"
+msgstr "别名"
+
#, php-format
msgid ""
"Extra nicknames for the group, separated with commas or spaces. Maximum %d "
msgid "Add or edit %s design"
msgstr "添加或编辑 %s 外观"
+#. TRANS: Group actions header (h2). Text hidden by default.
+msgid "Group actions"
+msgstr "小组动作"
+
#. TRANS: Title for groups with the most members section.
msgid "Groups with most members"
msgstr "人气最旺的小组"
msgid "Notice repeated"
msgstr "消息已转发"
+msgid "Update your status..."
+msgstr ""
+
msgid "Nudge this user"
msgstr "呼叫用户"
msgid "User %1$s (%2$d) has no profile record."
msgstr "用户 %1$s (%2$d) 没有个人信息记录。"
-msgid "Edit Avatar"
-msgstr "编辑头像"
-
-#. TRANS: H2 for user actions in a profile.
-#. TRANS: H2 for entity actions in a profile.
-msgid "User actions"
-msgstr "用户动作"
-
-#. TRANS: Text shown in user profile of not yet compeltely deleted users.
-msgid "User deletion in progress..."
-msgstr "用户删除处理中……"
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit profile settings"
-msgstr "编辑个人信息设置"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "编辑"
-
-#. TRANS: Link title for link on user profile.
-msgid "Send a direct message to this user"
-msgstr "给该用户发送私信"
-
-#. TRANS: Link text for link on user profile.
-msgid "Message"
-msgstr "私信"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "Moderate"
-msgstr "审核"
-
-#. TRANS: Label text on user profile to select a user role.
-msgid "User role"
-msgstr "用户权限"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Administrator"
-msgstr "管理员"
-
-#. TRANS: Role that can be set for a user profile.
-msgctxt "role"
-msgid "Moderator"
-msgstr "审核员"
-
msgid "Not allowed to log in."
msgstr "不允许登录。"
msgid "Getting backup from file '%s'."
msgstr "从文件'%s'获取备份。"
-#, fuzzy
-#~ msgid "Friends timeline"
-#~ msgstr "%s的时间线"
-
-#, fuzzy
-#~ msgid "Everyone on this site"
-#~ msgstr "搜索本站用户"
+#~ msgid "Invalid tag: \"%s\""
+#~ msgstr "无效的标签:\"%s\"。"
--- /dev/null
+# Translation of StatusNet - AccountManager to German (Deutsch)
+# Exported from translatewiki.net
+#
+# Author: Habi
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - AccountManager\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:17:33+0000\n"
+"Language-Team: German <http://translatewiki.net/wiki/Portal:de>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-08 01:21:58+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: de\n"
+"X-Message-Group: #out-statusnet-plugin-accountmanager\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid ""
+"The Account Manager plugin implements the Account Manager specification."
+msgstr ""
+"Das Account-Manager-Plugin implementiert die Account-Manager-Spezifikation."
--- /dev/null
+# Translation of StatusNet - Aim to Swedish (Svenska)
+# Exported from translatewiki.net
+#
+# Author: WikiPhoenix
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Aim\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:17:36+0000\n"
+"Language-Team: Swedish <http://translatewiki.net/wiki/Portal:sv>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-08 01:22:52+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: sv\n"
+"X-Message-Group: #out-statusnet-plugin-aim\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Send me a message to post a notice"
+msgstr ""
+
+msgid "AIM"
+msgstr "AIM"
+
+msgid ""
+"The AIM plugin allows users to send and receive notices over the AIM network."
+msgstr ""
+"AIM-tillägget tillåter användare skicka och ta emot meddelanden över AIM-"
+"nätverket."
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: AutocompletePlugin.php:80
+#: AutocompletePlugin.php:82
msgid ""
"The autocomplete plugin allows users to autocomplete screen names in @ "
"replies. When an \"@\" is typed into the notice text area, an autocomplete "
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid "Simple extension for supporting bookmarks."
msgstr ""
-#: BookmarkPlugin.php:639
+#: BookmarkPlugin.php:642
msgid "Bookmark"
msgstr ""
msgstr ""
"Project-Id-Version: StatusNet - Bookmark\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:50+0000\n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:17:50+0000\n"
"Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-06 02:12:57+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-POT-Import-Date: 2011-03-08 01:22:22+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ia\n"
"X-Message-Group: #out-statusnet-plugin-bookmark\n"
msgstr "Extension simple pro supportar marcapaginas."
msgid "Bookmark"
-msgstr ""
+msgstr "Marcapaginas"
msgctxt "BUTTON"
msgid "Upload"
msgstr ""
"Project-Id-Version: StatusNet - Bookmark\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:50+0000\n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:17:50+0000\n"
"Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-06 02:12:57+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-POT-Import-Date: 2011-03-08 01:22:22+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: mk\n"
"X-Message-Group: #out-statusnet-plugin-bookmark\n"
msgstr "Прост додаток за поддршка на обележувачи."
msgid "Bookmark"
-msgstr ""
+msgstr "Одбележи"
msgctxt "BUTTON"
msgid "Upload"
msgstr ""
"Project-Id-Version: StatusNet - Bookmark\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:50+0000\n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:17:50+0000\n"
"Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-06 02:12:57+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-POT-Import-Date: 2011-03-08 01:22:22+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: nl\n"
"X-Message-Group: #out-statusnet-plugin-bookmark\n"
msgstr "Eenvoudige extensie voor de ondersteuning van bladwijzers."
msgid "Bookmark"
-msgstr ""
+msgstr "Bladwijzer"
msgctxt "BUTTON"
msgid "Upload"
msgstr ""
"Project-Id-Version: StatusNet - Bookmark\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:05:50+0000\n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:17:50+0000\n"
"Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-06 02:12:57+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-POT-Import-Date: 2011-03-08 01:22:22+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: uk\n"
"X-Message-Group: #out-statusnet-plugin-bookmark\n"
msgstr "Простий додаток, що підтримує додавання закладок."
msgid "Bookmark"
-msgstr ""
+msgstr "Закладка"
msgctxt "BUTTON"
msgid "Upload"
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: actions/userdirectory.php:94
+#, php-format
+msgid "User Directory, page %d"
+msgstr ""
+
+#: actions/userdirectory.php:96
+msgid "User directory"
+msgstr ""
+
+#: actions/userdirectory.php:99
+#, php-format
+msgid "User directory - %s"
+msgstr ""
+
+#: actions/userdirectory.php:104
+#, php-format
+msgid "User directory - %s, page %d"
+msgstr ""
+
+#: actions/userdirectory.php:265
+msgctxt "BUTTON"
+msgid "Search"
+msgstr ""
+
+#: actions/userdirectory.php:370
+#, php-format
+msgid "No users starting with %s"
+msgstr ""
+
+#: DirectoryPlugin.php:187
+msgid "Add a user directory."
+msgstr ""
+
+#: lib/sortablesubscriptionlist.php:66
+msgid "Nickname"
+msgstr ""
+
+#: lib/sortablesubscriptionlist.php:67
+msgid "Created"
+msgstr ""
--- /dev/null
+# Translation of StatusNet - Directory to Interlingua (Interlingua)
+# Exported from translatewiki.net
+#
+# Author: McDutchie
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Directory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:50:27+0000\n"
+"Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:57:51+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: ia\n"
+"X-Message-Group: #out-statusnet-plugin-directory\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, php-format
+msgid "User Directory, page %d"
+msgstr "Catalogo de usatores, pagina %d"
+
+msgid "User directory"
+msgstr "Catalogo de usatores"
+
+#, php-format
+msgid "User directory - %s"
+msgstr "Catalogo de usatores - %s"
+
+#, php-format
+msgid "User directory - %s, page %d"
+msgstr "Catalogo de usatores - %s, pagina %d"
+
+msgctxt "BUTTON"
+msgid "Search"
+msgstr "Cercar"
+
+#, php-format
+msgid "No users starting with %s"
+msgstr "Il non ha usatores de qui le nomine comencia con \"%s\""
+
+msgid "Add a user directory."
+msgstr "Adder un catalogo de usatores."
+
+msgid "Nickname"
+msgstr "Pseudonymo"
+
+msgid "Created"
+msgstr "Create le"
--- /dev/null
+# Translation of StatusNet - Directory to Macedonian (Македонски)
+# Exported from translatewiki.net
+#
+# Author: Bjankuloski06
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Directory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:50:27+0000\n"
+"Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:57:51+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: mk\n"
+"X-Message-Group: #out-statusnet-plugin-directory\n"
+"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"
+
+#, php-format
+msgid "User Directory, page %d"
+msgstr "Кориснички именик, стр. %d"
+
+msgid "User directory"
+msgstr "Кориснички именик"
+
+#, php-format
+msgid "User directory - %s"
+msgstr "Кориснички именик - %s"
+
+#, php-format
+msgid "User directory - %s, page %d"
+msgstr "Кориснички именик - %s, стр. %d"
+
+msgctxt "BUTTON"
+msgid "Search"
+msgstr "Пребарај"
+
+#, php-format
+msgid "No users starting with %s"
+msgstr "Нема корисници што почнуваат на %s"
+
+msgid "Add a user directory."
+msgstr "Додај кориснички именик."
+
+msgid "Nickname"
+msgstr "Прекар"
+
+msgid "Created"
+msgstr "Создадено"
--- /dev/null
+# Translation of StatusNet - Directory to Dutch (Nederlands)
+# Exported from translatewiki.net
+#
+# Author: McDutchie
+# Author: Siebrand
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Directory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:50:27+0000\n"
+"Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:57:51+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: nl\n"
+"X-Message-Group: #out-statusnet-plugin-directory\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, php-format
+msgid "User Directory, page %d"
+msgstr "Gebruikerslijst, pagina %d"
+
+msgid "User directory"
+msgstr "Gebruikerslijst"
+
+#, php-format
+msgid "User directory - %s"
+msgstr "Gebruikerslijst - %s"
+
+#, php-format
+msgid "User directory - %s, page %d"
+msgstr "Gebruikerslijst - %s, pagina %d"
+
+msgctxt "BUTTON"
+msgid "Search"
+msgstr "Zoeken"
+
+#, php-format
+msgid "No users starting with %s"
+msgstr "Er zijn geen gebruikers wiens naam begint met \"%s\""
+
+msgid "Add a user directory."
+msgstr "Een gebruikerslijst toevoegen."
+
+msgid "Nickname"
+msgstr "Gebruikersnaam"
+
+msgid "Created"
+msgstr "Aangemaakt"
--- /dev/null
+# Translation of StatusNet - Directory to Ukrainian (Українська)
+# Exported from translatewiki.net
+#
+# Author: Boogie
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Directory\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:50:27+0000\n"
+"Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:57:51+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: uk\n"
+"X-Message-Group: #out-statusnet-plugin-directory\n"
+"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
+"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"
+
+#, php-format
+msgid "User Directory, page %d"
+msgstr "Каталог користувача, сторінка %d"
+
+msgid "User directory"
+msgstr "Каталог користувача"
+
+#, php-format
+msgid "User directory - %s"
+msgstr "Каталог користувача — %s"
+
+#, php-format
+msgid "User directory - %s, page %d"
+msgstr "Каталог користувача — %s, сторінка %d"
+
+msgctxt "BUTTON"
+msgid "Search"
+msgstr "Пошук"
+
+#, php-format
+msgid "No users starting with %s"
+msgstr "Немає користувачів, починаючи з %s"
+
+msgid "Add a user directory."
+msgstr "Додати каталог користувача."
+
+msgid "Nickname"
+msgstr "Псевдонім"
+
+msgid "Created"
+msgstr "Створено"
$obj->extra[] = array('dtstart',
array('xmlns' => 'urn:ietf:params:xml:ns:xcal'),
- common_date_iso8601($happening->start_date));
+ common_date_iso8601($happening->start_time));
$obj->extra[] = array('dtend',
array('xmlns' => 'urn:ietf:params:xml:ns:xcal'),
- common_date_iso8601($happening->end_date));
+ common_date_iso8601($happening->end_time));
// XXX: probably need other stuff here
function showRSVPNotice($notice, $out)
{
- $out->raw($notice->rendered);
+ $rsvp = RSVP::fromNotice($notice);
+
+ $out->elementStart('div', 'rsvp');
+ $out->raw($rsvp->asHTML());
+ $out->elementEnd('div');
return;
}
assert(!empty($event));
assert(!empty($profile));
- $out->elementStart('div', 'vevent'); // VEVENT IN
+ $out->elementStart('div', 'vevent event'); // VEVENT IN
$out->elementStart('h3'); // VEVENT/H3 IN
$out->elementEnd('h3'); // VEVENT/H3 OUT
+ $startDate = strftime("%x", strtotime($event->start_time));
+ $startTime = strftime("%R", strtotime($event->start_time));
+
+ $endDate = strftime("%x", strtotime($event->end_time));
+ $endTime = strftime("%R", strtotime($event->end_time));
+
// FIXME: better dates
$out->elementStart('div', 'event-times'); // VEVENT/EVENT-TIMES IN
+
+ $out->element('strong', null, _('Time:'));
+
$out->element('abbr', array('class' => 'dtstart',
'title' => common_date_iso8601($event->start_time)),
- common_exact_date($event->start_time));
+ $startDate . ' ' . $startTime);
$out->text(' - ');
- $out->element('span', array('class' => 'dtend',
- 'title' => common_date_iso8601($event->end_time)),
- common_exact_date($event->end_time));
+ if ($startDate == $endDate) {
+ $out->element('span', array('class' => 'dtend',
+ 'title' => common_date_iso8601($event->end_time)),
+ $endTime);
+ } else {
+ $out->element('span', array('class' => 'dtend',
+ 'title' => common_date_iso8601($event->end_time)),
+ $endDate . ' ' . $endTime);
+ }
+
$out->elementEnd('div'); // VEVENT/EVENT-TIMES OUT
- if (!empty($event->description)) {
- $out->element('div', 'description', $event->description);
+ if (!empty($event->location)) {
+ $out->elementStart('div', 'event-location');
+ $out->element('strong', null, _('Location: '));
+ $out->element('span', 'location', $event->location);
+ $out->elementEnd('div');
}
- if (!empty($event->location)) {
- $out->element('div', 'location', $event->location);
+ if (!empty($event->description)) {
+ $out->elementStart('div', 'event-description');
+ $out->element('strong', null, _('Description: '));
+ $out->element('span', 'description', $event->description);
+ $out->elementEnd('div');
}
$rsvps = $event->getRSVPs();
- $out->element('div', 'event-rsvps',
+ $out->elementStart('div', 'event-rsvps');
+ $out->element('strong', null, _('Attending: '));
+ $out->element('span', 'event-rsvps',
sprintf(_('Yes: %d No: %d Maybe: %d'),
count($rsvps[RSVP::POSITIVE]),
count($rsvps[RSVP::NEGATIVE]),
count($rsvps[RSVP::POSSIBLE])));
+ $out->elementEnd('div');
$user = common_current_user();
if (!empty($user)) {
$rsvp = $event->getRSVP($user->getProfile());
- common_log(LOG_DEBUG, "RSVP is: " . ($rsvp ? $rsvp->id : 'none'));
if (empty($rsvp)) {
$form = new RSVPForm($event, $out);
common_log(LOG_DEBUG, "Not deleting related, wtf...");
}
}
+
+ function onEndShowScripts($action)
+ {
+ $action->inlineScript('$(document).ready(function() { $("#startdate").datepicker(); $("#enddate").datepicker(); });');
+ }
+
+ function onEndShowStyles($action)
+ {
+ $action->cssLink($this->path('event.css'));
+ return true;
+ }
}
public $uri; // varchar(255)
public $profile_id; // int
public $event_id; // varchar(36) UUID
- public $result; // tinyint
+ public $response; // tinyint
public $created; // datetime
/**
'length' => 36,
'not null' => true,
'description' => 'UUID'),
- 'result' => array('type' => 'tinyint',
- 'description' => '1, 0, or null for three-state yes, no, maybe'),
+ 'response' => array('type' => 'char',
+ 'length' => '1',
+ 'description' => 'Y, N, or ? for three-state yes, no, maybe'),
'created' => array('type' => 'datetime',
'not null' => true),
),
);
}
- function saveNew($profile, $event, $result, $options=array())
+ function saveNew($profile, $event, $verb, $options=array())
{
+ common_debug("RSVP::saveNew({$profile->id}, {$event->id}, '$verb', 'some options');");
+
if (array_key_exists('uri', $options)) {
$other = RSVP::staticGet('uri', $options['uri']);
if (!empty($other)) {
$rsvp->id = UUID::gen();
$rsvp->profile_id = $profile->id;
$rsvp->event_id = $event->id;
- $rsvp->result = self::codeFor($result);
+ $rsvp->response = self::codeFor($verb);
+
+ common_debug("Got value {$rsvp->response} for verb {$verb}");
if (array_key_exists('created', $options)) {
$rsvp->created = $options['created'];
// XXX: come up with something sexier
- $content = sprintf(_('RSVPed %s for an event.'),
- ($result == RSVP::POSITIVE) ? _('positively') :
- ($result == RSVP::NEGATIVE) ? _('negatively') : _('possibly'));
+ $content = $rsvp->asString();
- $rendered = $content;
+ $rendered = $rsvp->asHTML();
- $options = array_merge(array('object_type' => $result),
+ $options = array_merge(array('object_type' => $verb),
$options);
if (!array_key_exists('uri', $options)) {
function codeFor($verb)
{
- return ($verb == RSVP::POSITIVE) ? 1 :
- ($verb == RSVP::NEGATIVE) ? 0 : null;
+ switch ($verb) {
+ case RSVP::POSITIVE:
+ return 'Y';
+ break;
+ case RSVP::NEGATIVE:
+ return 'N';
+ break;
+ case RSVP::POSSIBLE:
+ return '?';
+ break;
+ default:
+ throw new Exception("Unknown verb {$verb}");
+ }
}
static function verbFor($code)
{
- return ($code == 1) ? RSVP::POSITIVE :
- ($code == 0) ? RSVP::NEGATIVE : null;
+ switch ($code) {
+ case 'Y':
+ return RSVP::POSITIVE;
+ break;
+ case 'N':
+ return RSVP::NEGATIVE;
+ break;
+ case '?':
+ return RSVP::POSSIBLE;
+ break;
+ default:
+ throw new Exception("Unknown code {$code}");
+ }
}
function getNotice()
static function forEvent($event)
{
- $rsvps = array(RSVP::POSITIVE => array(), RSVP::NEGATIVE => array(), RSVP::POSSIBLE => array());
+ $rsvps = array(RSVP::POSITIVE => array(),
+ RSVP::NEGATIVE => array(),
+ RSVP::POSSIBLE => array());
$rsvp = new RSVP();
if ($rsvp->find()) {
while ($rsvp->fetch()) {
- $verb = self::verbFor($rsvp->result);
+ $verb = self::verbFor($rsvp->response);
$rsvps[$verb][] = clone($rsvp);
}
}
return $rsvps;
}
+
+ function getProfile()
+ {
+ $profile = Profile::staticGet('id', $this->profile_id);
+ if (empty($profile)) {
+ throw new Exception("No profile with ID {$this->profile_id}");
+ }
+ return $profile;
+ }
+
+ function getEvent()
+ {
+ $event = Happening::staticGet('id', $this->event_id);
+ if (empty($event)) {
+ throw new Exception("No event with ID {$this->event_id}");
+ }
+ return $event;
+ }
+
+ function asHTML()
+ {
+ return self::toHTML($this->getProfile(),
+ $this->getEvent(),
+ $this->response);
+ }
+
+ function asString()
+ {
+ return self::toString($this->getProfile(),
+ $this->getEvent(),
+ $this->response);
+ }
+
+ static function toHTML($profile, $event, $response)
+ {
+ $fmt = null;
+
+ $notice = $event->getNotice();
+
+ switch ($response) {
+ case 'Y':
+ $fmt = _("<span class='automatic event-rsvp'><a href='%1s'>%2s</a> is attending <a href='%3s'>%4s</a>.</span>");
+ break;
+ case 'N':
+ $fmt = _("<span class='automatic event-rsvp'><a href='%1s'>%2s</a> is not attending <a href='%3s'>%4s</a>.</span>");
+ break;
+ case '?':
+ $fmt = _("<span class='automatic event-rsvp'><a href='%1s'>%2s</a> might attend <a href='%3s'>%4s</a>.</span>");
+ break;
+ default:
+ throw new Exception("Unknown response code {$response}");
+ break;
+ }
+
+ return sprintf($fmt,
+ htmlspecialchars($profile->profileurl),
+ htmlspecialchars($profile->getBestName()),
+ htmlspecialchars($notice->bestUrl()),
+ htmlspecialchars($event->title));
+ }
+
+ static function toString($profile, $event, $response)
+ {
+ $fmt = null;
+
+ $notice = $event->getNotice();
+
+ switch ($response) {
+ case 'Y':
+ $fmt = _("%1s is attending %2s.");
+ break;
+ case 'N':
+ $fmt = _("%1s is not attending %2s.");
+ break;
+ case '?':
+ $fmt = _("%1s might attend %2s.>");
+ break;
+ default:
+ throw new Exception("Unknown response code {$response}");
+ break;
+ }
+
+ return sprintf($fmt,
+ $profile->getBestName(),
+ $event->title);
+ }
}
$this->out->hidden('rsvp', $this->rsvp->id);
- switch (RSVP::verbFor($this->rsvp->result)) {
+ switch (RSVP::verbFor($this->rsvp->response)) {
case RSVP::POSITIVE:
$this->out->text(_('You will attend this event.'));
break;
--- /dev/null
+.event-tags li { display: inline; }
+.event-mentions li { display: inline; }
+.event-avatar { float: left; }
+.event-notice-count { float: right; }
+.event-info { float: left; }
+.event-title { margin-left: 0px; }
+#content .event .entry-title { margin-left: 0px; }
+#content .event .entry-content { margin-left: 0px; }
+
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: cancelrsvpform.php:126
+msgctxt "BUTTON"
+msgid "Cancel"
+msgstr ""
+
+#: rsvpform.php:117
+msgctxt "BUTTON"
+msgid "Yes"
+msgstr ""
+
+#: rsvpform.php:118
+msgctxt "BUTTON"
+msgid "No"
+msgstr ""
+
+#: rsvpform.php:119
+msgctxt "BUTTON"
+msgid "Maybe"
+msgstr ""
+
+#: eventform.php:162
+msgctxt "BUTTON"
+msgid "Save"
+msgstr ""
+
+#: EventPlugin.php:133
+msgid "Event invitations and RSVPs."
+msgstr ""
+
+#: EventPlugin.php:138
+msgid "Event"
+msgstr ""
--- /dev/null
+# Translation of StatusNet - Event to Interlingua (Interlingua)
+# Exported from translatewiki.net
+#
+# Author: McDutchie
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Event\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:50:35+0000\n"
+"Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:57:56+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: ia\n"
+"X-Message-Group: #out-statusnet-plugin-event\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "BUTTON"
+msgid "Cancel"
+msgstr "Cancellar"
+
+msgctxt "BUTTON"
+msgid "Yes"
+msgstr "Si"
+
+msgctxt "BUTTON"
+msgid "No"
+msgstr "No"
+
+msgctxt "BUTTON"
+msgid "Maybe"
+msgstr "Forsan"
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Salveguardar"
+
+msgid "Event invitations and RSVPs."
+msgstr "Invitationes a eventos e responsas a illos."
+
+msgid "Event"
+msgstr "Evento"
--- /dev/null
+# Translation of StatusNet - Event to Macedonian (Македонски)
+# Exported from translatewiki.net
+#
+# Author: Bjankuloski06
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Event\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:50:35+0000\n"
+"Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:57:56+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: mk\n"
+"X-Message-Group: #out-statusnet-plugin-event\n"
+"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"
+
+msgctxt "BUTTON"
+msgid "Cancel"
+msgstr "Откажи"
+
+msgctxt "BUTTON"
+msgid "Yes"
+msgstr "Да"
+
+msgctxt "BUTTON"
+msgid "No"
+msgstr "Не"
+
+msgctxt "BUTTON"
+msgid "Maybe"
+msgstr "Можеби"
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Зачувај"
+
+msgid "Event invitations and RSVPs."
+msgstr "Покани и одговори за настани"
+
+msgid "Event"
+msgstr "Настан"
--- /dev/null
+# Translation of StatusNet - Event to Dutch (Nederlands)
+# Exported from translatewiki.net
+#
+# Author: Siebrand
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Event\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:50:35+0000\n"
+"Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:57:56+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: nl\n"
+"X-Message-Group: #out-statusnet-plugin-event\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "BUTTON"
+msgid "Cancel"
+msgstr "Annuleren"
+
+msgctxt "BUTTON"
+msgid "Yes"
+msgstr "Ja"
+
+msgctxt "BUTTON"
+msgid "No"
+msgstr "Nee"
+
+msgctxt "BUTTON"
+msgid "Maybe"
+msgstr "Misschien"
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Opslaan"
+
+msgid "Event invitations and RSVPs."
+msgstr "Uitnodigingen en RVSP's."
+
+msgid "Event"
+msgstr "Gebeurtenis"
--- /dev/null
+# Translation of StatusNet - Event to Telugu (తెలుగు)
+# Exported from translatewiki.net
+#
+# Author: Veeven
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Event\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:50:35+0000\n"
+"Language-Team: Telugu <http://translatewiki.net/wiki/Portal:te>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:57:56+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: te\n"
+"X-Message-Group: #out-statusnet-plugin-event\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgctxt "BUTTON"
+msgid "Cancel"
+msgstr "రద్దుచేయి"
+
+msgctxt "BUTTON"
+msgid "Yes"
+msgstr "అవును"
+
+msgctxt "BUTTON"
+msgid "No"
+msgstr "కాదు"
+
+msgctxt "BUTTON"
+msgid "Maybe"
+msgstr "కావొచ్చు"
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "భద్రపరచు"
+
+msgid "Event invitations and RSVPs."
+msgstr ""
+
+msgid "Event"
+msgstr ""
--- /dev/null
+# Translation of StatusNet - Event to Ukrainian (Українська)
+# Exported from translatewiki.net
+#
+# Author: Boogie
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Event\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:50:35+0000\n"
+"Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:57:56+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: uk\n"
+"X-Message-Group: #out-statusnet-plugin-event\n"
+"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
+"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"
+
+msgctxt "BUTTON"
+msgid "Cancel"
+msgstr "Відміна"
+
+msgctxt "BUTTON"
+msgid "Yes"
+msgstr "Так"
+
+msgctxt "BUTTON"
+msgid "No"
+msgstr "Ні"
+
+msgctxt "BUTTON"
+msgid "Maybe"
+msgstr "Можливо"
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Зберегти"
+
+msgid "Event invitations and RSVPs."
+msgstr "Запрошення на заходи та RSVP (підтвердження прийняття запрошення)."
+
+msgid "Event"
+msgstr "Подія"
protected $title = null;
protected $location = null;
protected $description = null;
- protected $start_time = null;
- protected $end_time = null;
+ protected $startTime = null;
+ protected $endTime = null;
/**
* Returns the title of the action
}
$this->title = $this->trimmed('title');
+
+ if (empty($this->title)) {
+ throw new ClientException(_('Title required.'));
+ }
+
$this->location = $this->trimmed('location');
$this->url = $this->trimmed('url');
$this->description = $this->trimmed('description');
- $start_date = $this->trimmed('start_date');
- $start_time = $this->trimmed('start_time');
- $end_date = $this->trimmed('end_date');
- $end_time = $this->trimmed('end_time');
+ $startDate = $this->trimmed('startdate');
+
+ if (empty($startDate)) {
+ throw new ClientException(_('Start date required.'));
+ }
+
+ $startTime = $this->trimmed('starttime');
+
+ if (empty($startTime)) {
+ $startTime = '00:00';
+ }
+
+ $endDate = $this->trimmed('enddate');
+
+ if (empty($endDate)) {
+ throw new ClientException(_('End date required.'));
+ }
+
+ $endTime = $this->trimmed('endtime');
- $this->start_time = strtotime($start_date . ' ' . $start_time);
- $this->end_time = strtotime($end_date . ' ' . $end_time);
+ if (empty($endTime)) {
+ $endTime = '00:00';
+ }
+
+ $start = $startDate . ' ' . $startTime;
+
+ common_debug("Event start: '$start'");
+
+ $end = $endDate . ' ' . $endTime;
+
+ common_debug("Event start: '$end'");
+
+ $this->startTime = strtotime($start);
+ $this->endTime = strtotime($end);
+
+ if ($this->startTime == 0) {
+ throw new Exception(sprintf(_('Could not parse date "%s"'),
+ $start));
+ }
+
+
+ if ($this->endTime == 0) {
+ throw new Exception(sprintf(_('Could not parse date "%s"'),
+ $end));
+ }
return true;
}
throw new ClientException(_('Event must have a title.'));
}
- if (empty($this->start_time)) {
+ if (empty($this->startTime)) {
throw new ClientException(_('Event must have a start time.'));
}
- if (empty($this->end_time)) {
+ if (empty($this->endTime)) {
throw new ClientException(_('Event must have an end time.'));
}
$profile = $this->user->getProfile();
$saved = Happening::saveNew($profile,
- $this->start_time,
- $this->end_time,
+ $this->startTime,
+ $this->endTime,
$this->title,
$this->location,
$this->description,
{
protected $user = null;
protected $event = null;
- protected $type = null;
+ protected $verb = null;
/**
* Returns the title of the action
throw new ClientException(_('You must be logged in to RSVP for an event.'));
}
- if ($this->arg('yes')) {
- $this->type = RSVP::POSITIVE;
- } else if ($this->arg('no')) {
- $this->type = RSVP::NEGATIVE;
- } else {
- $this->type = RSVP::POSSIBLE;
+ common_debug(print_r($this->args, true));
+
+ switch (strtolower($this->trimmed('submitvalue'))) {
+ case 'yes':
+ $this->verb = RSVP::POSITIVE;
+ break;
+ case 'no':
+ $this->verb = RSVP::NEGATIVE;
+ break;
+ case 'maybe':
+ $this->verb = RSVP::POSSIBLE;
+ break;
+ default:
+ throw new ClientException('Unknown submit value.');
}
+
return true;
}
try {
$saved = RSVP::saveNew($this->user->getProfile(),
$this->event,
- $this->type);
+ $this->verb);
} catch (ClientException $ce) {
$this->error = $ce->getMessage();
$this->showPage();
$this->out->text(_('RSVP: '));
$this->out->hidden('event', $this->event->id);
+ $this->out->hidden('submitvalue', '');
$this->out->elementEnd('fieldset');
}
function formActions()
{
- $this->out->submit('yes', _m('BUTTON', 'Yes'));
- $this->out->submit('no', _m('BUTTON', 'No'));
- $this->out->submit('maybe', _m('BUTTON', 'Maybe'));
+ $this->submitButton('yes', _m('BUTTON', 'Yes'));
+ $this->submitButton('no', _m('BUTTON', 'No'));
+ $this->submitButton('maybe', _m('BUTTON', 'Maybe'));
+ }
+
+ function submitButton($id, $label)
+ {
+ $this->out->element('input', array('type' => 'submit',
+ 'id' => $id,
+ 'name' => $id,
+ 'class' => 'submit',
+ 'value' => $label,
+ 'title' => $label,
+ 'onClick' => 'this.form.submitvalue.value = this.name; return true;'));
}
}
function onPluginVersion(&$versions)
{
- $versions[] = array('name' => 'ExtendedProfile',
- 'version' => STATUSNET_VERSION,
- 'author' => 'Brion Vibber',
- 'homepage' => 'http://status.net/wiki/Plugin:ExtendedProfile',
- 'rawdescription' =>
- _m('UI extensions for additional profile fields.'));
+ $versions[] = array(
+ 'name' => 'ExtendedProfile',
+ 'version' => STATUSNET_VERSION,
+ 'author' => 'Brion Vibber, Samantha Doherty, Zach Copley',
+ 'homepage' => 'http://status.net/wiki/Plugin:ExtendedProfile',
+ 'rawdescription' => _m(
+ 'UI extensions for additional profile fields.')
+ );
return true;
}
*/
function onAutoload($cls)
{
- $lower = strtolower($cls);
- switch ($lower)
+ $dir = dirname(__FILE__);
+
+ switch (strtolower($cls))
{
- case 'extendedprofile':
- case 'extendedprofilewidget':
case 'profiledetailaction':
case 'profiledetailsettingsaction':
- require_once dirname(__FILE__) . '/' . $lower . '.php';
+ case 'userautocompleteaction':
+ include_once $dir . '/actions/'
+ . strtolower(mb_substr($cls, 0, -6)) . '.php';
+ return false;
+ break; // Safety first!
+ case 'extendedprofile':
+ case 'extendedprofilewidget':
+ include_once $dir . '/lib/' . strtolower($cls) . '.php';
return false;
+ break;
case 'profile_detail':
- require_once dirname(__FILE__) . '/' . ucfirst($lower) . '.php';
+ include_once $dir . '/classes/' . ucfirst($cls) . '.php';
return false;
+ break;
default:
return true;
}
*/
function onStartInitializeRouter($m)
{
- $m->connect(':nickname/detail',
- array('action' => 'profiledetail'),
- array('nickname' => Nickname::DISPLAY_FMT));
- $m->connect('settings/profile/detail',
- array('action' => 'profiledetailsettings'));
+ $m->connect(
+ ':nickname/detail',
+ array('action' => 'profiledetail'),
+ array('nickname' => Nickname::DISPLAY_FMT)
+ );
+ $m->connect(
+ '/settings/profile/finduser',
+ array('action' => 'Userautocomplete')
+ );
+ $m->connect(
+ 'settings/profile/detail',
+ array('action' => 'profiledetailsettings')
+ );
return true;
}
$schema = Schema::get();
$schema->ensureTable('profile_detail', Profile_detail::schemaDef());
- // @hack until key definition support is merged
- Profile_detail::fixIndexes($schema);
return true;
}
- function onEndAccountSettingsProfileMenuItem($widget, $menu)
- {
- // TRANS: Link title attribute in user account settings menu.
- $title = _('Change additional profile settings');
- // TRANS: Link description in user account settings menu.
- $widget->showMenuItem('profiledetailsettings',_m('Details'),$title);
- return true;
- }
-
- function onEndProfilePageProfileElements(HTMLOutputter $out, Profile $profile) {
+ function onStartProfilePageActionsSection(HTMLOutputter $out, Profile $profile) {
$user = User::staticGet('id', $profile->id);
if ($user) {
$url = common_local_url('profiledetail', array('nickname' => $user->nickname));
- $out->element('a', array('href' => $url), _m('More details...'));
+ $out->element('a', array('href' => $url, 'class' => 'profiledetail'), _m('More details...'));
}
- return;
+ return true;
}
}
+++ /dev/null
-<?php
-/*
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2011, StatusNet, Inc.
- *
- * 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/>.
- */
-
-if (!defined('STATUSNET')) {
- exit(1);
-}
-
-class Profile_detail extends Memcached_DataObject
-{
- public $__table = 'submirror';
-
- public $id;
-
- public $profile_id;
- public $field;
- public $field_index; // relative ordering of multiple values in the same field
-
- public $value; // primary text value
- public $rel; // detail for some field types; eg "home", "mobile", "work" for phones or "aim", "irc", "xmpp" for IM
- public $ref_profile; // for people types, allows pointing to a known profile in the system
-
- public $created;
- public $modified;
-
- public /*static*/ function staticGet($k, $v=null)
- {
- return parent::staticGet(__CLASS__, $k, $v);
- }
-
- /**
- * return table definition for DB_DataObject
- *
- * DB_DataObject needs to know something about the table to manipulate
- * instances. This method provides all the DB_DataObject needs to know.
- *
- * @return array array of column definitions
- */
-
- function table()
- {
- return array('id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
-
- 'profile_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
- 'field' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
- 'field_index' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
-
- 'value' => DB_DATAOBJECT_STR,
- 'rel' => DB_DATAOBJECT_STR,
- 'ref_profile' => DB_DATAOBJECT_ID,
-
- 'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL,
- 'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
- }
-
- static function schemaDef()
- {
- // @fixme need a reverse key on (subscribed, subscriber) as well
- return array(new ColumnDef('id', 'integer',
- null, false, 'PRI'),
-
- // @fixme need a unique index on these three
- new ColumnDef('profile_id', 'integer',
- null, false),
- new ColumnDef('field', 'varchar',
- 16, false),
- new ColumnDef('field_index', 'integer',
- null, false),
-
- new ColumnDef('value', 'text',
- null, true),
- new ColumnDef('rel', 'varchar',
- 16, true),
- new ColumnDef('ref_profile', 'integer',
- null, true),
-
- new ColumnDef('created', 'datetime',
- null, false),
- new ColumnDef('modified', 'datetime',
- null, false));
- }
-
- /**
- * Temporary hack to set up the compound index, since we can't do
- * it yet through regular Schema interface. (Coming for 1.0...)
- *
- * @param Schema $schema
- * @return void
- */
- static function fixIndexes($schema)
- {
- try {
- // @fixme this won't be a unique index... SIGH
- $schema->createIndex('profile_detail', array('profile_id', 'field', 'field_index'));
- } catch (Exception $e) {
- common_log(LOG_ERR, __METHOD__ . ': ' . $e->getMessage());
- }
- }
-
- /**
- * return key definitions for DB_DataObject
- *
- * DB_DataObject needs to know about keys that the table has; this function
- * defines them.
- *
- * @return array key definitions
- */
-
- function keys()
- {
- return array_keys($this->keyTypes());
- }
-
- /**
- * return key definitions for Memcached_DataObject
- *
- * Our caching system uses the same key definitions, but uses a different
- * method to get them.
- *
- * @return array key definitions
- */
-
- function keyTypes()
- {
- // @fixme keys
- // need a sane key for reverse lookup too
- return array('id' => 'K');
- }
-
- function sequenceKey()
- {
- return array('id', true);
- }
-
-}
--- /dev/null
+<?php
+/*
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * 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/>.
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+class ProfileDetailAction extends ShowstreamAction
+{
+
+ function isReadOnly($args)
+ {
+ return true;
+ }
+
+ function title()
+ {
+ return $this->profile->getFancyName();
+ }
+
+ function showStylesheets() {
+ parent::showStylesheets();
+ $this->cssLink('plugins/ExtendedProfile/css/profiledetail.css');
+ return true;
+ }
+
+ function showContent()
+ {
+ $cur = common_current_user();
+ if ($cur && $cur->id == $this->profile->id) { // your own page
+ $this->elementStart('div', 'entity_actions');
+ $this->elementStart('ul');
+ $this->elementStart('li', 'entity_edit');
+ $this->element('a', array('href' => common_local_url('profiledetailsettings'),
+ // TRANS: Link title for link on user profile.
+ 'title' => _m('Edit extended profile settings')),
+ // TRANS: Link text for link on user profile.
+ _m('Edit'));
+ $this->elementEnd('li');
+ $this->elementEnd('ul');
+ $this->elementEnd('div');
+ }
+
+ $widget = new ExtendedProfileWidget($this, $this->profile);
+ $widget->show();
+ }
+}
--- /dev/null
+<?php
+/*
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * 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/>.
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+class ProfileDetailSettingsAction extends ProfileSettingsAction
+{
+
+ function title()
+ {
+ return _m('Extended profile settings');
+ }
+
+ /**
+ * Instructions for use
+ *
+ * @return instructions for use
+ */
+ function getInstructions()
+ {
+ // TRANS: Usage instructions for profile settings.
+ return _m('You can update your personal profile info here '.
+ 'so people know more about you.');
+ }
+
+ function showStylesheets() {
+ parent::showStylesheets();
+ $this->cssLink('plugins/ExtendedProfile/css/profiledetail.css');
+ return true;
+ }
+
+ function showScripts() {
+ parent::showScripts();
+ $this->script('plugins/ExtendedProfile/js/profiledetail.js');
+ return true;
+ }
+
+ function handlePost()
+ {
+ // CSRF protection
+ $token = $this->trimmed('token');
+ if (!$token || $token != common_session_token()) {
+ $this->showForm(
+ _m(
+ 'There was a problem with your session token. '
+ . 'Try again, please.'
+ )
+ );
+ return;
+ }
+
+ if ($this->arg('save')) {
+ $this->saveDetails();
+ } else {
+ // TRANS: Message given submitting a form with an unknown action.
+ $this->showForm(_m('Unexpected form submission.'));
+ }
+ }
+
+ function showContent()
+ {
+ $cur = common_current_user();
+ $profile = $cur->getProfile();
+
+ $widget = new ExtendedProfileWidget(
+ $this,
+ $profile,
+ ExtendedProfileWidget::EDITABLE
+ );
+ $widget->show();
+ }
+
+ function saveDetails()
+ {
+ common_debug(var_export($_POST, true));
+
+ $user = common_current_user();
+
+ try {
+ $this->saveStandardProfileDetails($user);
+
+ $profile = $user->getProfile();
+
+ $simpleFieldNames = array('title', 'spouse', 'kids', 'manager');
+ $dateFieldNames = array('birthday');
+
+ foreach ($simpleFieldNames as $name) {
+ $value = $this->trimmed('extprofile-' . $name);
+ if (!empty($value)) {
+ $this->saveField($user, $name, $value);
+ }
+ }
+
+ foreach ($dateFieldNames as $name) {
+ $value = $this->trimmed('extprofile-' . $name);
+ $dateVal = $this->parseDate($name, $value);
+ $this->saveField(
+ $user,
+ $name,
+ null,
+ null,
+ null,
+ $dateVal
+ );
+ }
+
+ $this->savePhoneNumbers($user);
+ $this->saveIms($user);
+ $this->saveWebsites($user);
+ $this->saveExperiences($user);
+ $this->saveEducations($user);
+
+ } catch (Exception $e) {
+ $this->showForm($e->getMessage(), false);
+ return;
+ }
+
+ $this->showForm(_m('Details saved.'), true);
+
+ }
+
+ function parseDate($fieldname, $datestr, $required = false)
+ {
+ if (empty($datestr)) {
+ if ($required) {
+ $msg = sprintf(
+ // TRANS: Exception thrown when no date was entered in a required date field.
+ // TRANS: %s is the field name.
+ _m('You must supply a date for "%s".'),
+ $fieldname
+ );
+ throw new Exception($msg);
+ }
+ } else {
+ $ts = strtotime($datestr);
+ if ($ts === false) {
+ throw new Exception(
+ sprintf(
+ // TRANS: Exception thrown on incorrect data input.
+ // TRANS: %1$s is a field name, %2$s is the incorrect input.
+ _m('Invalid date entered for "%1$s": %2$s.'),
+ $fieldname,
+ $ts
+ )
+ );
+ }
+ return common_sql_date($ts);
+ }
+ return null;
+ }
+
+ function savePhoneNumbers($user) {
+ $phones = $this->findPhoneNumbers();
+ $this->removeAll($user, 'phone');
+ $i = 0;
+ foreach($phones as $phone) {
+ if (!empty($phone['value'])) {
+ ++$i;
+ $this->saveField(
+ $user,
+ 'phone',
+ $phone['value'],
+ $phone['rel'],
+ $i
+ );
+ }
+ }
+ }
+
+ function findPhoneNumbers() {
+
+ // Form vals look like this:
+ // 'extprofile-phone-1' => '11332',
+ // 'extprofile-phone-1-rel' => 'mobile',
+
+ $phones = $this->sliceParams('phone', 2);
+ $phoneArray = array();
+
+ foreach ($phones as $phone) {
+ list($number, $rel) = array_values($phone);
+ $phoneArray[] = array(
+ 'value' => $number,
+ 'rel' => $rel
+ );
+ }
+
+ return $phoneArray;
+ }
+
+ function findIms() {
+
+ // Form vals look like this:
+ // 'extprofile-im-0' => 'jed',
+ // 'extprofile-im-0-rel' => 'yahoo',
+
+ $ims = $this->sliceParams('im', 2);
+ $imArray = array();
+
+ foreach ($ims as $im) {
+ list($id, $rel) = array_values($im);
+ $imArray[] = array(
+ 'value' => $id,
+ 'rel' => $rel
+ );
+ }
+
+ return $imArray;
+ }
+
+ function saveIms($user) {
+ $ims = $this->findIms();
+ $this->removeAll($user, 'im');
+ $i = 0;
+ foreach($ims as $im) {
+ if (!empty($im['value'])) {
+ ++$i;
+ $this->saveField(
+ $user,
+ 'im',
+ $im['value'],
+ $im['rel'],
+ $i
+ );
+ }
+ }
+ }
+
+ function findWebsites() {
+
+ // Form vals look like this:
+
+ $sites = $this->sliceParams('website', 2);
+ $wsArray = array();
+
+ foreach ($sites as $site) {
+ list($id, $rel) = array_values($site);
+ $wsArray[] = array(
+ 'value' => $id,
+ 'rel' => $rel
+ );
+ }
+
+ return $wsArray;
+ }
+
+ function saveWebsites($user) {
+ $sites = $this->findWebsites();
+ $this->removeAll($user, 'website');
+ $i = 0;
+ foreach($sites as $site) {
+ if (!empty($site['value']) && !Validate::uri(
+ $site['value'],
+ array('allowed_schemes' => array('http', 'https')))
+ ) {
+ // TRANS: Exception thrown when entering an invalid URL.
+ // TRANS: %s is the invalid URL.
+ throw new Exception(sprintf(_m('Invalid URL: %s.'), $site['value']));
+ }
+
+ if (!empty($site['value'])) {
+ ++$i;
+ $this->saveField(
+ $user,
+ 'website',
+ $site['value'],
+ $site['rel'],
+ $i
+ );
+ }
+ }
+ }
+
+ function findExperiences() {
+
+ // Form vals look like this:
+ // 'extprofile-experience-0' => 'Bozotronix',
+ // 'extprofile-experience-0-current' => 'true'
+ // 'extprofile-experience-0-start' => '1/5/10',
+ // 'extprofile-experience-0-end' => '2/3/11',
+
+ $experiences = $this->sliceParams('experience', 4);
+ $expArray = array();
+
+ foreach ($experiences as $exp) {
+ if (sizeof($experiences) == 4) {
+ list($company, $current, $end, $start) = array_values($exp);
+ } else {
+ $end = null;
+ list($company, $current, $start) = array_values($exp);
+ }
+ if (!empty($company)) {
+ $expArray[] = array(
+ 'company' => $company,
+ 'start' => $this->parseDate('Start', $start, true),
+ 'end' => ($current == 'false') ? $this->parseDate('End', $end, true) : null,
+ 'current' => ($current == 'false') ? false : true
+ );
+ }
+ }
+
+ return $expArray;
+ }
+
+ function saveExperiences($user) {
+ common_debug('save experiences');
+ $experiences = $this->findExperiences();
+
+ $this->removeAll($user, 'company');
+ $this->removeAll($user, 'start');
+ $this->removeAll($user, 'end'); // also stores 'current'
+
+ $i = 0;
+ foreach($experiences as $experience) {
+ if (!empty($experience['company'])) {
+ ++$i;
+ $this->saveField(
+ $user,
+ 'company',
+ $experience['company'],
+ null,
+ $i
+ );
+
+ $this->saveField(
+ $user,
+ 'start',
+ null,
+ null,
+ $i,
+ $experience['start']
+ );
+
+ // Save "current" employer indicator in rel
+ if ($experience['current']) {
+ $this->saveField(
+ $user,
+ 'end',
+ null,
+ 'current', // rel
+ $i
+ );
+ } else {
+ $this->saveField(
+ $user,
+ 'end',
+ null,
+ null,
+ $i,
+ $experience['end']
+ );
+ }
+
+ }
+ }
+ }
+
+ function findEducations() {
+
+ // Form vals look like this:
+ // 'extprofile-education-0-school' => 'Pigdog',
+ // 'extprofile-education-0-degree' => 'BA',
+ // 'extprofile-education-0-description' => 'Blar',
+ // 'extprofile-education-0-start' => '05/22/99',
+ // 'extprofile-education-0-end' => '05/22/05',
+
+ $edus = $this->sliceParams('education', 5);
+ $eduArray = array();
+
+ foreach ($edus as $edu) {
+ list($school, $degree, $description, $end, $start) = array_values($edu);
+ if (!empty($school)) {
+ $eduArray[] = array(
+ 'school' => $school,
+ 'degree' => $degree,
+ 'description' => $description,
+ 'start' => $this->parseDate('Start', $start, true),
+ 'end' => $this->parseDate('End', $end, true)
+ );
+ }
+ }
+
+ return $eduArray;
+ }
+
+
+ function saveEducations($user) {
+ common_debug('save education');
+ $edus = $this->findEducations();
+ common_debug(var_export($edus, true));
+
+ $this->removeAll($user, 'school');
+ $this->removeAll($user, 'degree');
+ $this->removeAll($user, 'degree_descr');
+ $this->removeAll($user, 'school_start');
+ $this->removeAll($user, 'school_end');
+
+ $i = 0;
+ foreach($edus as $edu) {
+ if (!empty($edu['school'])) {
+ ++$i;
+ $this->saveField(
+ $user,
+ 'school',
+ $edu['school'],
+ null,
+ $i
+ );
+ $this->saveField(
+ $user,
+ 'degree',
+ $edu['degree'],
+ null,
+ $i
+ );
+ $this->saveField(
+ $user,
+ 'degree_descr',
+ $edu['description'],
+ null,
+ $i
+ );
+ $this->saveField(
+ $user,
+ 'school_start',
+ null,
+ null,
+ $i,
+ $edu['start']
+ );
+
+ $this->saveField(
+ $user,
+ 'school_end',
+ null,
+ null,
+ $i,
+ $edu['end']
+ );
+ }
+ }
+ }
+
+ function arraySplit($array, $pieces)
+ {
+ if ($pieces < 2) {
+ return array($array);
+ }
+
+ $newCount = ceil(count($array) / $pieces);
+ $a = array_slice($array, 0, $newCount);
+ $b = $this->arraySplit(array_slice($array, $newCount), $pieces - 1);
+
+ return array_merge(array($a), $b);
+ }
+
+ function findMultiParams($type) {
+ $formVals = array();
+ $target = $type;
+ foreach ($_POST as $key => $val) {
+ if (strrpos('extprofile-' . $key, $target) !== false) {
+ $formVals[$key] = $val;
+ }
+ }
+ return $formVals;
+ }
+
+ function sliceParams($key, $size) {
+ $slice = array();
+ $params = $this->findMultiParams($key);
+ ksort($params);
+ $slice = $this->arraySplit($params, sizeof($params) / $size);
+ return $slice;
+ }
+
+ /**
+ * Save an extended profile field as a Profile_detail
+ *
+ * @param User $user the current user
+ * @param string $name field name
+ * @param string $value field value
+ * @param string $rel field rel (type)
+ * @param int $index index (fields can have multiple values)
+ * @param date $date related date
+ */
+ function saveField($user, $name, $value, $rel = null, $index = null, $date = null)
+ {
+ $profile = $user->getProfile();
+ $detail = new Profile_detail();
+
+ $detail->profile_id = $profile->id;
+ $detail->field_name = $name;
+ $detail->value_index = $index;
+
+ $result = $detail->find(true);
+
+ if (empty($result)) {
+ $detial->value_index = $index;
+ $detail->rel = $rel;
+ $detail->field_value = $value;
+ $detail->date = $date;
+ $detail->created = common_sql_now();
+ $result = $detail->insert();
+ if (empty($result)) {
+ common_log_db_error($detail, 'INSERT', __FILE__);
+ $this->serverError(_m('Could not save profile details.'));
+ }
+ } else {
+ $orig = clone($detail);
+
+ $detail->field_value = $value;
+ $detail->rel = $rel;
+ $detail->date = $date;
+
+ $result = $detail->update($orig);
+ if (empty($result)) {
+ common_log_db_error($detail, 'UPDATE', __FILE__);
+ $this->serverError(_m('Could not save profile details.'));
+ }
+ }
+
+ $detail->free();
+ }
+
+ function removeAll($user, $name)
+ {
+ $profile = $user->getProfile();
+ $detail = new Profile_detail();
+ $detail->profile_id = $profile->id;
+ $detail->field_name = $name;
+ $detail->delete();
+ $detail->free();
+ }
+
+ /**
+ * Save fields that should be stored in the main profile object
+ *
+ * XXX: There's a lot of dupe code here from ProfileSettingsAction.
+ * Do not want.
+ *
+ * @param User $user the current user
+ */
+ function saveStandardProfileDetails($user)
+ {
+ $fullname = $this->trimmed('extprofile-fullname');
+ $location = $this->trimmed('extprofile-location');
+ $tagstring = $this->trimmed('extprofile-tags');
+ $bio = $this->trimmed('extprofile-bio');
+
+ if ($tagstring) {
+ $tags = array_map(
+ 'common_canonical_tag',
+ preg_split('/[\s,]+/', $tagstring)
+ );
+ } else {
+ $tags = array();
+ }
+
+ foreach ($tags as $tag) {
+ if (!common_valid_profile_tag($tag)) {
+ // TRANS: Validation error in form for profile settings.
+ // TRANS: %s is an invalid tag.
+ throw new Exception(sprintf(_m('Invalid tag: "%s".'), $tag));
+ }
+ }
+
+ $profile = $user->getProfile();
+
+ $oldTags = $user->getSelfTags();
+ $newTags = array_diff($tags, $oldTags);
+
+ if ($fullname != $profile->fullname
+ || $location != $profile->location
+ || !empty($newTags)
+ || $bio != $profile->bio) {
+
+ $orig = clone($profile);
+
+ $profile->nickname = $user->nickname;
+ $profile->fullname = $fullname;
+ $profile->bio = $bio;
+ $profile->location = $location;
+
+ $loc = Location::fromName($location);
+
+ if (empty($loc)) {
+ $profile->lat = null;
+ $profile->lon = null;
+ $profile->location_id = null;
+ $profile->location_ns = null;
+ } else {
+ $profile->lat = $loc->lat;
+ $profile->lon = $loc->lon;
+ $profile->location_id = $loc->location_id;
+ $profile->location_ns = $loc->location_ns;
+ }
+
+ $profile->profileurl = common_profile_url($user->nickname);
+
+ $result = $profile->update($orig);
+
+ if ($result === false) {
+ common_log_db_error($profile, 'UPDATE', __FILE__);
+ // TRANS: Server error thrown when user profile settings could not be saved.
+ $this->serverError(_m('Could not save profile.'));
+ return;
+ }
+
+ // Set the user tags
+ $result = $user->setSelfTags($tags);
+
+ if (!$result) {
+ // TRANS: Server error thrown when user profile settings tags could not be saved.
+ $this->serverError(_m('Could not save tags.'));
+ return;
+ }
+
+ Event::handle('EndProfileSaveForm', array($this));
+ common_broadcast_profile($profile);
+ }
+ }
+
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Action for showing Twitter-like JSON search results
+ *
+ * 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 Search
+ * @package StatusNet
+ * @author Zach Copley <zach@status.net>
+ * @copyright 2011 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')) {
+ exit(1);
+}
+
+
+class UserautocompleteAction extends Action
+{
+ var $query;
+
+ /**
+ * Initialization.
+ *
+ * @param array $args Web and URL arguments
+ *
+ * @return boolean true if nothing goes wrong
+ */
+ function prepare($args)
+ {
+ parent::prepare($args);
+ $this->query = $this->trimmed('term');
+ return true;
+ }
+
+ /**
+ * Handle a request
+ *
+ * @param array $args Arguments from $_REQUEST
+ *
+ * @return void
+ */
+ function handle($args)
+ {
+ parent::handle($args);
+ $this->showResults();
+ }
+
+ /**
+ * Search for users matching the query and spit the results out
+ * as a quick-n-dirty JSON document
+ *
+ * @return void
+ */
+ function showResults()
+ {
+ $people = array();
+
+ $profile = new Profile();
+
+ $search_engine = $profile->getSearchEngine('profile');
+ $search_engine->set_sort_mode('nickname_desc');
+ $search_engine->limit(0, 10);
+ $search_engine->query(strtolower($this->query . '*'));
+
+ $cnt = $profile->find();
+
+ if ($cnt > 0) {
+
+ $sql = 'SELECT profile.* FROM profile, user WHERE profile.id = user.id '
+ . ' AND LEFT(LOWER(profile.nickname), '
+ . strlen($this->query)
+ . ') = \'%s\' '
+ . ' LIMIT 0, 10';
+
+ $profile->query(sprintf($sql, $this->query));
+ }
+
+ while ($profile->fetch()) {
+ $people[] = $profile->nickname;
+ }
+
+ header('Content-Type: application/json; charset=utf-8');
+ print json_encode($people);
+ }
+
+ /**
+ * Do we need to write to the database?
+ *
+ * @return boolean true
+ */
+ function isReadOnly($args)
+ {
+ return true;
+ }
+}
--- /dev/null
+<?php
+/*
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * 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/>.
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+/**
+ * DataObject class to store extended profile fields. Allows for storing
+ * multiple values per a "field_name" (field_name property is not unique).
+ *
+ * Example:
+ *
+ * Jed's Phone Numbers
+ * home : 510-384-1992
+ * mobile: 510-719-1139
+ * work : 415-231-1121
+ *
+ * We can store these phone numbers in a "field" represented by three
+ * Profile_detail objects, each named 'phone_number' like this:
+ *
+ * $phone1 = new Profile_detail();
+ * $phone1->field_name = 'phone_number';
+ * $phone1->rel = 'home';
+ * $phone1->field_value = '510-384-1992';
+ * $phone1->value_index = 1;
+ *
+ * $phone1 = new Profile_detail();
+ * $phone1->field_name = 'phone_number';
+ * $phone1->rel = 'mobile';
+ * $phone1->field_value = '510-719-1139';
+ * $phone1->value_index = 2;
+ *
+ * $phone1 = new Profile_detail();
+ * $phone1->field_name = 'phone_number';
+ * $phone1->rel = 'work';
+ * $phone1->field_value = '415-231-1121';
+ * $phone1->value_index = 3;
+ *
+ */
+class Profile_detail extends Managed_DataObject
+{
+ public $__table = 'profile_detail';
+
+ public $id;
+ public $profile_id; // profile this is for
+ public $rel; // detail for some field types; eg "home", "mobile", "work" for phones or "aim", "irc", "xmpp" for IM
+ public $field_name; // name
+ public $field_value; // primary text value
+ public $value_index; // relative ordering of multiple values in the same field
+ public $date; // related date
+ public $ref_profile; // for people types, allows pointing to a known profile in the system
+ public $created;
+ public $modified;
+
+ /**
+ * Get an instance by key
+ *
+ * This is a utility method to get a single instance with a given key value.
+ *
+ * @param string $k Key to use to lookup
+ * @param mixed $v Value to lookup
+ *
+ * @return User_greeting_count object found, or null for no hits
+ *
+ */
+
+ function staticGet($k, $v=null)
+ {
+ return Memcached_DataObject::staticGet('Profile_detail', $k, $v);
+ }
+
+ /**
+ * Get an instance by compound key
+ *
+ * This is a utility method to get a single instance with a given set of
+ * key-value pairs. Usually used for the primary key for a compound key; thus
+ * the name.
+ *
+ * @param array $kv array of key-value mappings
+ *
+ * @return Bookmark object found, or null for no hits
+ *
+ */
+
+ function pkeyGet($kv)
+ {
+ return Memcached_DataObject::pkeyGet('Profile_detail', $kv);
+ }
+
+ static function schemaDef()
+ {
+ return array(
+ 'description'
+ => 'Additional profile details for the ExtendedProfile plugin',
+ 'fields' => array(
+ 'id' => array('type' => 'serial', 'not null' => true),
+ 'profile_id' => array('type' => 'int', 'not null' => true),
+ 'field_name' => array(
+ 'type' => 'varchar',
+ 'length' => 16,
+ 'not null' => true
+ ),
+ 'value_index' => array('type' => 'int'),
+ 'field_value' => array('type' => 'text'),
+ 'date' => array('type' => 'datetime'),
+ 'rel' => array('type' => 'varchar', 'length' => 16),
+ 'rel_profile' => array('type' => 'int'),
+ 'created' => array(
+ 'type' => 'datetime',
+ 'not null' => true
+ ),
+ 'modified' => array(
+ 'type' => 'timestamp',
+ 'not null' => true
+ ),
+ ),
+ 'primary key' => array('id'),
+ 'unique keys' => array(
+ 'profile_detail_profile_id_field_name_value_index'
+ => array('profile_id', 'field_name', 'value_index'),
+ )
+ );
+ }
+
+}
--- /dev/null
+/* Note the #content is only needed to override weird crap in default styles */
+
+#profiledetail .entity_actions {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+#profiledetail #content h3 {
+ margin-bottom: 5px;
+}
+
+#content table.extended-profile {
+ width: 100%;
+ border-collapse: separate;
+ border-spacing: 0px 8px;
+ margin-bottom: 10px;
+}
+
+#content table.extended-profile th {
+ color: #777;
+ background-color: #ECECF2;
+ width: 150px;
+ text-align: right;
+ padding: 2px 8px 2px 0px;
+}
+
+#content table.extended-profile th.employer, #content table.extended-profile th.institution {
+ display: none;
+}
+
+#content table.extended-profile td {
+ padding: 2px 0px 2px 8px;
+}
+
+.experience-item, .education-item {
+ float: left;
+ padding-bottom: 4px;
+}
+
+.experience-item .label, .education-item .label {
+ float: left;
+ clear: left;
+ position: relative;
+ left: -8px;
+ margin-right: 2px;
+ margin-bottom: 8px;
+ color: #777;
+ background-color: #ECECF2;
+ width: 150px;
+ text-align: right;
+ padding: 2px 8px 2px 0px;
+}
+
+.experience-item .field, .education-item .field {
+ float: left;
+ padding-top: 2px;
+ padding-bottom: 2px;
+ max-width: 350px;
+}
+
+#profiledetailsettings #content table.extended-profile td {
+ padding: 0px 0px 0px 8px;
+}
+
+#profiledetailsettings input {
+ margin-right: 8px;
+}
+
+.form_settings .extended-profile label {
+ display: none;
+}
+
+.extended-profile textarea {
+ width: 280px;
+}
+
+.extended-profile input[type=text] {
+ width: 280px;
+}
+
+.extended-profile .phone-item input[type=text], .extended-profile .im-item input[type=text], .extended-profile .website-item input[type=text] {
+ width: 175px;
+}
+
+.extended-profile input.hasDatepicker {
+ width: 100px;
+}
+
+.experience-item input[type=text], .education-item input[type=text] {
+ float: left;
+}
+
+.extended-profile .current-checkbox {
+ float: left;
+ position: relative;
+ top: 2px;
+}
+
+.form_settings .extended-profile input.checkbox {
+ margin-left: 0px;
+ left: 0px;
+ top: 2px;
+}
+
+.form_settings .extended-profile label.checkbox {
+ max-width: 100%;
+ float: none;
+ display: inline;
+ left: -20px;
+}
+
+.extended-profile select {
+ padding-right: 2px;
+ font-size: 0.88em;
+}
+
+.extended-profile a.add_row, .extended-profile a.remove_row {
+ display: block;
+ height: 16px;
+ width: 16px;
+ overflow: hidden;
+ background-image: url('../../../theme/rebase/images/icons/icons-01.gif');
+ background-repeat: no-repeat;
+}
+
+.extended-profile a.remove_row {
+ background-position: 0px -1252px;
+ float: right;
+ position: relative;
+ top: 6px;
+ line-height: 4em;
+}
+
+.extended-profile a.add_row {
+ clear: both;
+ position: relative;
+ top: 6px;
+ left: 2px;
+ background-position: 0px -1186px;
+ width: 120px;
+ padding-left: 20px;
+ line-height: 1.2em;
+}
+
+#content table.extended-profile .supersizeme th {
+ border-bottom: 28px solid #fff;
+}
+
+#profiledetailsettings .experience-item, #profiledetailsettings .education-item {
+ margin-bottom: 10px;
+ width: 100%;
+}
+
+#profiledetailsettings .education-item textarea {
+ float: left;
+ margin-bottom: 8px;
+}
+
+#profiledetailsettings tr:last-child .experience-item, #profiledetailsettings tr:last-child .education-item {
+ margin-bottom: 0px;
+}
+
+#profiledetailsettings .experience-item a.add_row, #profiledetailsettings .education-item a.add_row {
+ left: 160px;
+}
+++ /dev/null
-<?php
-/*
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2011, StatusNet, Inc.
- *
- * 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/>.
- */
-
-if (!defined('STATUSNET')) {
- exit(1);
-}
-
-class ExtendedProfile
-{
- function __construct(Profile $profile)
- {
- $this->profile = $profile;
- $this->sections = $this->getSections();
- $this->fields = $this->loadFields();
- }
-
- function loadFields()
- {
- $detail = new Profile_detail();
- $detail->profile_id = $this->profile->id;
- $detail->find();
-
- while ($detail->get()) {
- $fields[$detail->field][] = clone($detail);
- }
- return $fields;
- }
-
- function getSections()
- {
- return array(
- 'basic' => array(
- 'label' => _m('Personal'),
- 'fields' => array(
- 'fullname' => array(
- 'label' => _m('Full name'),
- 'profile' => 'fullname',
- 'vcard' => 'fn',
- ),
- 'title' => array(
- 'label' => _m('Title'),
- 'vcard' => 'title',
- ),
- 'manager' => array(
- 'label' => _m('Manager'),
- 'type' => 'person',
- 'vcard' => 'x-manager',
- ),
- 'location' => array(
- 'label' => _m('Location'),
- 'profile' => 'location'
- ),
- 'bio' => array(
- 'label' => _m('Bio'),
- 'type' => 'textarea',
- 'profile' => 'bio',
- ),
- 'tags' => array(
- 'label' => _m('Tags'),
- 'type' => 'tags',
- 'profile' => 'tags',
- ),
- ),
- ),
- 'contact' => array(
- 'label' => _m('Contact'),
- 'fields' => array(
- 'phone' => array(
- 'label' => _m('Phone'),
- 'type' => 'phone',
- 'multi' => true,
- 'vcard' => 'tel',
- ),
- 'im' => array(
- 'label' => _m('IM'),
- 'type' => 'im',
- 'multi' => true,
- ),
- 'website' => array(
- 'label' => _m('Websites'),
- 'type' => 'website',
- 'multi' => true,
- ),
- ),
- ),
- 'personal' => array(
- 'label' => _m('Personal'),
- 'fields' => array(
- 'birthday' => array(
- 'label' => _m('Birthday'),
- 'type' => 'date',
- 'vcard' => 'bday',
- ),
- 'spouse' => array(
- 'label' => _m('Spouse\'s name'),
- 'vcard' => 'x-spouse',
- ),
- 'kids' => array(
- 'label' => _m('Kids\' names')
- ),
- ),
- ),
- 'experience' => array(
- 'label' => _m('Work experience'),
- 'fields' => array(
- 'experience' => array(
- 'type' => 'experience',
- 'label' => _m('Employer'),
- ),
- ),
- ),
- 'education' => array(
- 'label' => _m('Education'),
- 'fields' => array(
- 'education' => array(
- 'type' => 'education',
- 'label' => _m('Institution'),
- ),
- ),
- ),
- );
- }
-}
+++ /dev/null
-<?php
-/*
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2011, StatusNet, Inc.
- *
- * 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/>.
- */
-
-if (!defined('STATUSNET')) {
- exit(1);
-}
-
-class ExtendedProfileWidget extends Widget
-{
- const EDITABLE=true;
-
- protected $profile;
- protected $ext;
-
- public function __construct(XMLOutputter $out=null, Profile $profile=null, $editable=false)
- {
- parent::__construct($out);
-
- $this->profile = $profile;
- $this->ext = new ExtendedProfile($this->profile);
-
- $this->editable = $editable;
- }
-
- public function show()
- {
- $sections = $this->ext->getSections();
- foreach ($sections as $name => $section) {
- $this->showExtendedProfileSection($name, $section);
- }
- }
-
- protected function showExtendedProfileSection($name, $section)
- {
- $this->out->element('h3', null, $section['label']);
- $this->out->elementStart('table', array('class' => 'extended-profile'));
- foreach ($section['fields'] as $fieldName => $field) {
- $this->showExtendedProfileField($fieldName, $field);
- }
- $this->out->elementEnd('table');
- }
-
- protected function showExtendedProfileField($name, $field)
- {
- $this->out->elementStart('tr');
-
- $this->out->element('th', null, $field['label']);
-
- $this->out->elementStart('td');
- if ($this->editable) {
- $this->showEditableField($name, $field);
- } else {
- $this->showFieldValue($name, $field);
- }
- $this->out->elementEnd('td');
-
- $this->out->elementEnd('tr');
- }
-
- protected function showFieldValue($name, $field)
- {
- $this->out->text($name);
- }
-
- protected function showEditableField($name, $field)
- {
- $out = $this->out;
- //$out = new HTMLOutputter();
- // @fixme
- $type = strval(@$field['type']);
- $id = "extprofile-" . $name;
- $value = 'placeholder';
-
- switch ($type) {
- case '':
- case 'text':
- $out->input($id, null, $value);
- break;
- case 'textarea':
- $out->textarea($id, null, $value);
- break;
- default:
- $out->input($id, null, "TYPE: $type");
- }
- }
-}
--- /dev/null
+var SN_EXTENDED = SN_EXTENDED || {};
+
+SN_EXTENDED.reorder = function(cls) {
+
+ var divs = $('div[class=' + cls + ']');
+
+ $(divs).each(function(i, div) {
+ $(div).find('a.add_row').hide();
+ $(div).find('a.remove_row').show();
+ SN_EXTENDED.replaceIndex(SN_EXTENDED.rowIndex(div), i);
+ });
+
+ var lastDiv = $(divs).last().closest('tr');
+ lastDiv.addClass('supersizeme');
+
+ $(divs).last().find('a.add_row').show();
+
+ if (divs.length == 1) {
+ $(divs).find('a.remove_row').fadeOut("slow");
+ }
+};
+
+SN_EXTENDED.rowIndex = function(div) {
+ var idstr = $(div).attr('id');
+ var id = idstr.match(/\d+/);
+ return id;
+};
+
+SN_EXTENDED.rowCount = function(cls) {
+ var divs = $.find('div[class=' + cls + ']');
+ return divs.length;
+};
+
+SN_EXTENDED.replaceIndex = function(elem, oldIndex, newIndex) {
+ $(elem).find('*').each(function() {
+ $.each(this.attributes, function(i, attrib) {
+ var regexp = /extprofile-.*-\d.*/;
+ var value = attrib.value;
+ var match = value.match(regexp);
+ if (match !== null) {
+ attrib.value = value.replace("-" + oldIndex, "-" + newIndex);
+ }
+ });
+ });
+}
+
+SN_EXTENDED.resetRow = function(elem) {
+ $(elem).find('input, textarea').attr('value', '');
+ $(elem).find('input').removeAttr('disabled');
+ $(elem).find("select option[value='office']").attr("selected", true);
+ $(elem).find("input:checkbox").attr('checked', false);
+ $(elem).find("input[name$=-start], input[name$=-end]").each(function() {
+ $(this).removeClass('hasDatepicker');
+ $(this).datepicker({ dateFormat: 'd M yy' });
+ });
+};
+
+SN_EXTENDED.addRow = function() {
+ var div = $(this).closest('div');
+ var id = div.attr('id');
+ var cls = div.attr('class');
+ var index = id.match(/\d+/);
+ var newIndex = parseInt(index) + 1;
+ var newtr = $(div).closest('tr').removeClass('supersizeme').clone();
+ SN_EXTENDED.replaceIndex(newtr, index, newIndex);
+ SN_EXTENDED.resetRow(newtr);
+ $(div).closest('tr').after(newtr);
+ SN_EXTENDED.reorder(cls);
+};
+
+SN_EXTENDED.removeRow = function() {
+
+ var div = $(this).closest('div');
+ var id = $(div).attr('id');
+ var cls = $(div).attr('class');
+ var that = this;
+
+ $("#confirm-dialog").dialog({
+ buttons : {
+ "Confirm" : function() {
+ $(this).dialog("close");
+ var target = $(that).closest('tr');
+ target.fadeOut("slow", function() {
+ $(target).remove();
+ SN_EXTENDED.reorder(cls);
+ });
+ },
+ "Cancel" : function() {
+ $(this).dialog("close");
+ }
+ }
+ });
+
+ var cnt = SN_EXTENDED.rowCount(cls);
+
+ if (cnt > 1) {
+ $("#confirm-dialog").dialog("open");
+ }
+};
+
+$(document).ready(function() {
+
+ $("#confirm-dialog").dialog({
+ autoOpen: false,
+ modal: true
+ });
+
+ $("input#extprofile-manager").autocomplete({
+ source: 'finduser',
+ minLength: 2 });
+
+ $("input[name$=-start], input[name$=-end], #extprofile-birthday").datepicker({ dateFormat: 'd M yy' });
+
+ var multifields = ["phone-item", "experience-item", "education-item", "im-item", 'website-item'];
+
+ for (f in multifields) {
+ SN_EXTENDED.reorder(multifields[f]);
+ }
+
+ $("input#extprofile-manager").autocomplete({
+ source: 'finduser',
+ minLength: 2 });
+
+ $('.add_row').live('click', SN_EXTENDED.addRow);
+ $('.remove_row').live('click', SN_EXTENDED.removeRow);
+
+ $('input:checkbox[name$=current]').each(function() {
+ var input = $(this).parent().siblings('input[id$=-end]');
+ if ($(this).is(':checked')) {
+ $(input).attr('disabled', 'true');
+ }
+ });
+
+ $('input:checkbox[name$=current]').live('click', function() {
+ var input = $(this).parent().siblings('input[id$=-end]');
+ if ($(this).is(':checked')) {
+ $(input).val('');
+ $(input).attr('disabled', 'true');
+ } else {
+ $(input).removeAttr('disabled');
+ }
+ });
+
+});
--- /dev/null
+<?php
+/*
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * 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/>.
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+/**
+ * Class to represent extended profile data
+ */
+class ExtendedProfile
+{
+ protected $fields;
+
+ /**
+ * Constructor
+ *
+ * @param Profile $profile
+ */
+ function __construct(Profile $profile)
+ {
+ $this->profile = $profile;
+ $this->user = $profile->getUser();
+ $this->fields = $this->loadFields();
+ $this->sections = $this->getSections();
+ //common_debug(var_export($this->sections, true));
+
+ //common_debug(var_export($this->fields, true));
+ }
+
+ /**
+ * Load extended profile fields
+ *
+ * @return array $fields the list of fields
+ */
+ function loadFields()
+ {
+ $detail = new Profile_detail();
+ $detail->profile_id = $this->profile->id;
+ $detail->find();
+
+ $fields = array();
+
+ while ($detail->fetch()) {
+ $fields[$detail->field_name][] = clone($detail);
+ }
+
+ return $fields;
+ }
+
+ /**
+ * Get a the self-tags associated with this profile
+ *
+ * @return string the concatenated string of tags
+ */
+ function getTags()
+ {
+ return implode(' ', $this->user->getSelfTags());
+ }
+
+ /**
+ * Return a simple string value. Checks for fields that should
+ * be stored in the regular profile and returns values from it
+ * if appropriate.
+ *
+ * @param string $name name of the detail field to get the
+ * value from
+ *
+ * @return string the value
+ */
+ function getTextValue($name)
+ {
+ $key = strtolower($name);
+ $profileFields = array('fullname', 'location', 'bio');
+
+ if (in_array($key, $profileFields)) {
+ return $this->profile->$name;
+ } else if (array_key_exists($key, $this->fields)) {
+ return $this->fields[$key][0]->field_value;
+ } else {
+ return null;
+ }
+ }
+
+ function getDateValue($name) {
+ $key = strtolower($name);
+ if (array_key_exists($key, $this->fields)) {
+ return $this->fields[$key][0]->date;
+ } else {
+ return null;
+ }
+ }
+
+ // XXX: getPhones, getIms, and getWebsites pretty much do the same thing,
+ // so refactor.
+ function getPhones()
+ {
+ $phones = (isset($this->fields['phone'])) ? $this->fields['phone'] : null;
+ $pArrays = array();
+
+ if (empty($phones)) {
+ $pArrays[] = array(
+ 'label' => _m('Phone'),
+ 'index' => 0,
+ 'type' => 'phone',
+ 'vcard' => 'tel',
+ 'rel' => 'office',
+ 'value' => null
+ );
+ } else {
+ for ($i = 0; $i < sizeof($phones); $i++) {
+ $pa = array(
+ 'label' => _m('Phone'),
+ 'type' => 'phone',
+ 'index' => intval($phones[$i]->value_index),
+ 'rel' => $phones[$i]->rel,
+ 'value' => $phones[$i]->field_value,
+ 'vcard' => 'tel'
+ );
+
+ $pArrays[] = $pa;
+ }
+ }
+ return $pArrays;
+ }
+
+ function getIms()
+ {
+ $ims = (isset($this->fields['im'])) ? $this->fields['im'] : null;
+ $iArrays = array();
+
+ if (empty($ims)) {
+ $iArrays[] = array(
+ 'label' => _m('IM'),
+ 'type' => 'im'
+ );
+ } else {
+ for ($i = 0; $i < sizeof($ims); $i++) {
+ $ia = array(
+ 'label' => _m('IM'),
+ 'type' => 'im',
+ 'index' => intval($ims[$i]->value_index),
+ 'rel' => $ims[$i]->rel,
+ 'value' => $ims[$i]->field_value,
+ );
+
+ $iArrays[] = $ia;
+ }
+ }
+ return $iArrays;
+ }
+
+ function getWebsites()
+ {
+ $sites = (isset($this->fields['website'])) ? $this->fields['website'] : null;
+ $wArrays = array();
+
+ if (empty($sites)) {
+ $wArrays[] = array(
+ 'label' => _m('Website'),
+ 'type' => 'website'
+ );
+ } else {
+ for ($i = 0; $i < sizeof($sites); $i++) {
+ $wa = array(
+ 'label' => _m('Website'),
+ 'type' => 'website',
+ 'index' => intval($sites[$i]->value_index),
+ 'rel' => $sites[$i]->rel,
+ 'value' => $sites[$i]->field_value,
+ );
+
+ $wArrays[] = $wa;
+ }
+ }
+ return $wArrays;
+ }
+
+ function getExperiences()
+ {
+ $companies = (isset($this->fields['company'])) ? $this->fields['company'] : null;
+ $start = (isset($this->fields['start'])) ? $this->fields['start'] : null;
+ $end = (isset($this->fields['end'])) ? $this->fields['end'] : null;
+
+ $eArrays = array();
+
+ if (empty($companies)) {
+ $eArrays[] = array(
+ 'label' => _m('Employer'),
+ 'type' => 'experience',
+ 'company' => null,
+ 'start' => null,
+ 'end' => null,
+ 'current' => false,
+ 'index' => 0
+ );
+ } else {
+ for ($i = 0; $i < sizeof($companies); $i++) {
+ $ea = array(
+ 'label' => _m('Employer'),
+ 'type' => 'experience',
+ 'company' => $companies[$i]->field_value,
+ 'index' => intval($companies[$i]->value_index),
+ 'current' => $end[$i]->rel,
+ 'start' => $start[$i]->date,
+ 'end' => $end[$i]->date
+ );
+ $eArrays[] = $ea;
+ }
+ }
+ return $eArrays;
+ }
+
+ function getEducation()
+ {
+ $schools = (isset($this->fields['school'])) ? $this->fields['school'] : null;
+ $degrees = (isset($this->fields['degree'])) ? $this->fields['degree'] : null;
+ $descs = (isset($this->fields['degree_descr'])) ? $this->fields['degree_descr'] : null;
+ $start = (isset($this->fields['school_start'])) ? $this->fields['school_start'] : null;
+ $end = (isset($this->fields['school_end'])) ? $this->fields['school_end'] : null;
+ $iArrays = array();
+
+ if (empty($schools)) {
+ $iArrays[] = array(
+ 'type' => 'education',
+ 'label' => _m('Institution'),
+ 'school' => null,
+ 'degree' => null,
+ 'description' => null,
+ 'start' => null,
+ 'end' => null,
+ 'index' => 0
+ );
+ } else {
+ for ($i = 0; $i < sizeof($schools); $i++) {
+ $ia = array(
+ 'type' => 'education',
+ 'label' => _m('Institution'),
+ 'school' => $schools[$i]->field_value,
+ 'degree' => isset($degrees[$i]->field_value) ? $degrees[$i]->field_value : null,
+ 'description' => isset($descs[$i]->field_value) ? $descs[$i]->field_value : null,
+ 'index' => intval($schools[$i]->value_index),
+ 'start' => $start[$i]->date,
+ 'end' => $end[$i]->date
+ );
+ $iArrays[] = $ia;
+ }
+ }
+
+ return $iArrays;
+ }
+
+ /**
+ * Return all the sections of the extended profile
+ *
+ * @return array the big list of sections and fields
+ */
+ function getSections()
+ {
+ return array(
+ 'basic' => array(
+ 'label' => _m('Personal'),
+ 'fields' => array(
+ 'fullname' => array(
+ 'label' => _m('Full name'),
+ 'profile' => 'fullname',
+ 'vcard' => 'fn',
+ ),
+ 'title' => array(
+ 'label' => _m('Title'),
+ 'vcard' => 'title',
+ ),
+ 'manager' => array(
+ 'label' => _m('Manager'),
+ 'type' => 'person',
+ 'vcard' => 'x-manager',
+ ),
+ 'location' => array(
+ 'label' => _m('Location'),
+ 'profile' => 'location'
+ ),
+ 'bio' => array(
+ 'label' => _m('Bio'),
+ 'type' => 'textarea',
+ 'profile' => 'bio',
+ ),
+ 'tags' => array(
+ 'label' => _m('Tags'),
+ 'type' => 'tags',
+ 'profile' => 'tags',
+ ),
+ ),
+ ),
+ 'contact' => array(
+ 'label' => _m('Contact'),
+ 'fields' => array(
+ 'phone' => $this->getPhones(),
+ 'im' => $this->getIms(),
+ 'website' => $this->getWebsites()
+ ),
+ ),
+ 'personal' => array(
+ 'label' => _m('Personal'),
+ 'fields' => array(
+ 'birthday' => array(
+ 'label' => _m('Birthday'),
+ 'type' => 'date',
+ 'vcard' => 'bday',
+ ),
+ 'spouse' => array(
+ 'label' => _m('Spouse\'s name'),
+ 'vcard' => 'x-spouse',
+ ),
+ 'kids' => array(
+ 'label' => _m('Kids\' names')
+ ),
+ ),
+ ),
+ 'experience' => array(
+ 'label' => _m('Work experience'),
+ 'fields' => array(
+ 'experience' => $this->getExperiences()
+ ),
+ ),
+ 'education' => array(
+ 'label' => _m('Education'),
+ 'fields' => array(
+ 'education' => $this->getEducation()
+ ),
+ ),
+ );
+ }
+}
--- /dev/null
+<?php
+/*
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * 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/>.
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+/**
+ * Class for outputting a widget to display or edit
+ * extended profiles
+ */
+class ExtendedProfileWidget extends Form
+{
+ const EDITABLE = true;
+
+ /**
+ * The parent profile
+ *
+ * @var Profile
+ */
+ protected $profile;
+
+ /**
+ * The extended profile
+ *
+ * @var Extended_profile
+ */
+ protected $ext;
+
+ /**
+ * Constructor
+ *
+ * @param XMLOutputter $out
+ * @param Profile $profile
+ * @param boolean $editable
+ */
+ public function __construct(XMLOutputter $out=null, Profile $profile=null, $editable=false)
+ {
+ parent::__construct($out);
+
+ $this->profile = $profile;
+ $this->ext = new ExtendedProfile($this->profile);
+
+ $this->editable = $editable;
+ }
+
+ /**
+ * Show the extended profile, or the edit form
+ */
+ public function show()
+ {
+ if ($this->editable) {
+ parent::show();
+ } else {
+ $this->showSections();
+ }
+ }
+
+ /**
+ * Show form data
+ */
+ public function formData()
+ {
+ // For JQuery UI modal dialog
+ $this->out->elementStart(
+ 'div',
+ array('id' => 'confirm-dialog', 'title' => 'Confirmation Required')
+ );
+ $this->out->text('Really delete this entry?');
+ $this->out->elementEnd('div');
+ $this->showSections();
+ }
+
+ /**
+ * Show each section of the extended profile
+ */
+ public function showSections()
+ {
+ $sections = $this->ext->getSections();
+ foreach ($sections as $name => $section) {
+ $this->showExtendedProfileSection($name, $section);
+ }
+ }
+
+ /**
+ * Show an extended profile section
+ *
+ * @param string $name name of the section
+ * @param array $section array of fields for the section
+ */
+ protected function showExtendedProfileSection($name, $section)
+ {
+ $this->out->element('h3', null, $section['label']);
+ $this->out->elementStart('table', array('class' => 'extended-profile'));
+
+ foreach ($section['fields'] as $fieldName => $field) {
+
+ switch($fieldName) {
+ case 'phone':
+ case 'im':
+ case 'website':
+ case 'experience':
+ case 'education':
+ $this->showMultiple($fieldName, $field);
+ break;
+ default:
+ $this->showExtendedProfileField($fieldName, $field);
+ }
+ }
+ $this->out->elementEnd('table');
+ }
+
+ /**
+ * Show an extended profile field
+ *
+ * @param string $name name of the field
+ * @param array $field set of key/value pairs for the field
+ */
+ protected function showExtendedProfileField($name, $field)
+ {
+ $this->out->elementStart('tr');
+
+ $this->out->element('th', str_replace(' ','_',strtolower($field['label'])), $field['label']);
+
+ $this->out->elementStart('td');
+ if ($this->editable) {
+ $this->showEditableField($name, $field);
+ } else {
+ $this->showFieldValue($name, $field);
+ }
+ $this->out->elementEnd('td');
+
+ $this->out->elementEnd('tr');
+ }
+
+ protected function showMultiple($name, $fields) {
+ foreach ($fields as $field) {
+ $this->showExtendedProfileField($name, $field);
+ }
+ }
+
+ // XXX: showPhone, showIm and showWebsite all work the same, so
+ // combine
+ protected function showPhone($name, $field)
+ {
+ $this->out->elementStart('div', array('class' => 'phone-display'));
+ if (!empty($field['value'])) {
+ $this->out->text($field['value']);
+ if (!empty($field['rel'])) {
+ $this->out->text(' (' . $field['rel'] . ')');
+ }
+ }
+ $this->out->elementEnd('div');
+ }
+
+ protected function showIm($name, $field)
+ {
+ $this->out->elementStart('div', array('class' => 'im-display'));
+ $this->out->text($field['value']);
+ if (!empty($field['rel'])) {
+ $this->out->text(' (' . $field['rel'] . ')');
+ }
+ $this->out->elementEnd('div');
+ }
+
+ protected function showWebsite($name, $field)
+ {
+ $this->out->elementStart('div', array('class' => 'website-display'));
+
+ $url = $field['value'];
+
+ $this->out->element(
+ "a",
+ array(
+ 'href' => $url,
+ 'class' => 'extended-profile-link',
+ 'target' => "_blank"
+ ),
+ $url
+ );
+
+ if (!empty($field['rel'])) {
+ $this->out->text(' (' . $field['rel'] . ')');
+ }
+ $this->out->elementEnd('div');
+ }
+
+ protected function showEditableIm($name, $field)
+ {
+ $index = isset($field['index']) ? $field['index'] : 0;
+ $id = "extprofile-$name-$index";
+ $rel = $id . '-rel';
+ $this->out->elementStart(
+ 'div', array(
+ 'id' => $id . '-edit',
+ 'class' => 'im-item'
+ )
+ );
+ $this->out->input(
+ $id,
+ null,
+ isset($field['value']) ? $field['value'] : null
+ );
+ $this->out->dropdown(
+ $id . '-rel',
+ 'Type',
+ array(
+ 'jabber' => 'Jabber',
+ 'gtalk' => 'GTalk',
+ 'aim' => 'AIM',
+ 'yahoo' => 'Yahoo! Messenger',
+ 'msn' => 'MSN',
+ 'skype' => 'Skype',
+ 'other' => 'Other'
+ ),
+ null,
+ false,
+ isset($field['rel']) ? $field['rel'] : null
+ );
+
+ $this->showMultiControls();
+ $this->out->elementEnd('div');
+ }
+
+ protected function showEditablePhone($name, $field)
+ {
+ $index = isset($field['index']) ? $field['index'] : 0;
+ $id = "extprofile-$name-$index";
+ $rel = $id . '-rel';
+ $this->out->elementStart(
+ 'div', array(
+ 'id' => $id . '-edit',
+ 'class' => 'phone-item'
+ )
+ );
+ $this->out->input(
+ $id,
+ null,
+ isset($field['value']) ? $field['value'] : null
+ );
+ $this->out->dropdown(
+ $id . '-rel',
+ 'Type',
+ array(
+ 'office' => 'Office',
+ 'mobile' => 'Mobile',
+ 'home' => 'Home',
+ 'pager' => 'Pager',
+ 'other' => 'Other'
+ ),
+ null,
+ false,
+ isset($field['rel']) ? $field['rel'] : null
+ );
+
+ $this->showMultiControls();
+ $this->out->elementEnd('div');
+ }
+
+ protected function showEditableWebsite($name, $field)
+ {
+ $index = isset($field['index']) ? $field['index'] : 0;
+ $id = "extprofile-$name-$index";
+ $rel = $id . '-rel';
+ $this->out->elementStart(
+ 'div', array(
+ 'id' => $id . '-edit',
+ 'class' => 'website-item'
+ )
+ );
+ $this->out->input(
+ $id,
+ null,
+ isset($field['value']) ? $field['value'] : null
+ );
+ $this->out->dropdown(
+ $id . '-rel',
+ 'Type',
+ array(
+ 'blog' => 'Blog',
+ 'homepage' => 'Homepage',
+ 'facebook' => 'Facebook',
+ 'linkedin' => 'LinkedIn',
+ 'flickr' => 'Flickr',
+ 'google' => 'Google Profile',
+ 'other' => 'Other',
+ 'twitter' => 'Twitter'
+ ),
+ null,
+ false,
+ isset($field['rel']) ? $field['rel'] : null
+ );
+
+ $this->showMultiControls();
+ $this->out->elementEnd('div');
+ }
+
+ protected function showExperience($name, $field)
+ {
+ $this->out->elementStart('div', 'experience-item');
+ $this->out->element('div', 'label', _m('Company'));
+
+ if (!empty($field['company'])) {
+ $this->out->element('div', 'field', $field['company']);
+
+ $this->out->element('div', 'label', _m('Start'));
+ $this->out->element(
+ 'div',
+ array('class' => 'field date'),
+ date('j M Y', strtotime($field['start'])
+ )
+ );
+ $this->out->element('div', 'label', _m('End'));
+ $this->out->element(
+ 'div',
+ array('class' => 'field date'),
+ date('j M Y', strtotime($field['end'])
+ )
+ );
+
+ if ($field['current']) {
+ $this->out->element(
+ 'div',
+ array('class' => 'field current'),
+ '(' . _m('Current') . ')'
+ );
+ }
+ }
+ $this->out->elementEnd('div');
+ }
+
+ protected function showEditableExperience($name, $field)
+ {
+ $index = isset($field['index']) ? $field['index'] : 0;
+ $id = "extprofile-$name-$index";
+ $this->out->elementStart(
+ 'div', array(
+ 'id' => $id . '-edit',
+ 'class' => 'experience-item'
+ )
+ );
+
+ $this->out->element('div', 'label', _m('Company'));
+ $this->out->input(
+ $id,
+ null,
+ isset($field['company']) ? $field['company'] : null
+ );
+
+ $this->out->element('div', 'label', _m('Start'));
+ $this->out->input(
+ $id . '-start',
+ null,
+ isset($field['start']) ? date('j M Y', strtotime($field['start'])) : null
+ );
+
+ $this->out->element('div', 'label', _m('End'));
+
+ $this->out->input(
+ $id . '-end',
+ null,
+ isset($field['end']) ? date('j M Y', strtotime($field['end'])) : null
+ );
+ $this->out->hidden(
+ $id . '-current',
+ 'false'
+ );
+ $this->out->elementStart('div', 'current-checkbox');
+ $this->out->checkbox(
+ $id . '-current',
+ _m('Current'),
+ $field['current']
+ );
+ $this->out->elementEnd('div');
+
+ $this->showMultiControls();
+ $this->out->elementEnd('div');
+ }
+
+ protected function showEducation($name, $field)
+ {
+ $this->out->elementStart('div', 'education-item');
+ $this->out->element('div', 'label', _m('Institution'));
+ if (!empty($field['school'])) {
+
+ $this->out->element('div', 'field', $field['school']);
+ $this->out->element('div', 'label', _m('Degree'));
+ $this->out->element('div', 'field', $field['degree']);
+ $this->out->element('div', 'label', _m('Description'));
+ $this->out->element('div', 'field', $field['description']);
+ $this->out->element('div', 'label', _m('Start'));
+ $this->out->element(
+ 'div',
+ array('class' => 'field date'),
+ date('j M Y', strtotime($field['start'])
+ )
+ );
+ $this->out->element('div', 'label', _m('End'));
+ $this->out->element(
+ 'div',
+ array('class' => 'field date'),
+ date('j M Y', strtotime($field['end'])
+ )
+ );
+ }
+ $this->out->elementEnd('div');
+ }
+
+ protected function showEditableEducation($name, $field)
+ {
+ $index = isset($field['index']) ? $field['index'] : 0;
+ $id = "extprofile-$name-$index";
+ $this->out->elementStart(
+ 'div', array(
+ 'id' => $id . '-edit',
+ 'class' => 'education-item'
+ )
+ );
+ $this->out->element('div', 'label', _m('Institution'));
+ $this->out->input(
+ $id,
+ null,
+ isset($field['school']) ? $field['school'] : null
+ );
+
+ $this->out->element('div', 'label', _m('Degree'));
+ $this->out->input(
+ $id . '-degree',
+ null,
+ isset($field['degree']) ? $field['degree'] : null
+ );
+
+ $this->out->element('div', 'label', _m('Description'));
+
+ $this->out->textarea(
+ $id . '-description',
+ null,
+ isset($field['description']) ? $field['description'] : null
+ );
+
+ $this->out->element('div', 'label', _m('Start'));
+ $this->out->input(
+ $id . '-start',
+ null,
+ isset($field['start']) ? date('j M Y', strtotime($field['start'])) : null
+ );
+
+ $this->out->element('div', 'label', _m('End'));
+ $this->out->input(
+ $id . '-end',
+ null,
+ isset($field['end']) ? date('j M Y', strtotime($field['end'])) : null
+ );
+
+ $this->showMultiControls();
+ $this->out->elementEnd('div');
+ }
+
+ function showMultiControls()
+ {
+ $this->out->element(
+ 'a',
+ array(
+ 'class' => 'remove_row',
+ 'href' => 'javascript://',
+ 'style' => 'display: none;'
+ ),
+ '-'
+ );
+
+ $this->out->element(
+ 'a',
+ array(
+ 'class' => 'add_row',
+ 'href' => 'javascript://',
+ 'style' => 'display: none;'
+ ),
+ 'Add another item'
+ );
+ }
+
+ /**
+ * Outputs the value of a field
+ *
+ * @param string $name name of the field
+ * @param array $field set of key/value pairs for the field
+ */
+ protected function showFieldValue($name, $field)
+ {
+ $type = strval(@$field['type']);
+
+ switch($type)
+ {
+ case '':
+ case 'text':
+ case 'textarea':
+ $this->out->text($this->ext->getTextValue($name));
+ break;
+ case 'date':
+ $value = $this->ext->getDateValue($name);
+ if (!empty($value)) {
+ $this->out->element(
+ 'div',
+ array('class' => 'field date'),
+ date('j M Y', strtotime($value))
+ );
+ }
+ break;
+ case 'person':
+ $this->out->text($this->ext->getTextValue($name));
+ break;
+ case 'tags':
+ $this->out->text($this->ext->getTags());
+ break;
+ case 'phone':
+ $this->showPhone($name, $field);
+ break;
+ case 'website':
+ $this->showWebsite($name, $field);
+ break;
+ case 'im':
+ $this->showIm($name, $field);
+ break;
+ case 'experience':
+ $this->showExperience($name, $field);
+ break;
+ case 'education':
+ $this->showEducation($name, $field);
+ break;
+ default:
+ $this->out->text("TYPE: $type");
+ }
+ }
+
+ /**
+ * Show an editable version of the field
+ *
+ * @param string $name name fo the field
+ * @param array $field array of key/value pairs for the field
+ */
+ protected function showEditableField($name, $field)
+ {
+ $out = $this->out;
+
+ $type = strval(@$field['type']);
+ $id = "extprofile-" . $name;
+
+ $value = 'placeholder';
+
+ switch ($type) {
+ case '':
+ case 'text':
+ $out->input($id, null, $this->ext->getTextValue($name));
+ break;
+ case 'date':
+ $value = $this->ext->getDateValue($name);
+ $out->input(
+ $id,
+ null,
+ empty($value) ? null : date('j M Y', strtotime($value))
+ );
+ break;
+ case 'person':
+ $out->input($id, null, $this->ext->getTextValue($name));
+ break;
+ case 'textarea':
+ $out->textarea($id, null, $this->ext->getTextValue($name));
+ break;
+ case 'tags':
+ $out->input($id, null, $this->ext->getTags());
+ break;
+ case 'phone':
+ $this->showEditablePhone($name, $field);
+ break;
+ case 'im':
+ $this->showEditableIm($name, $field);
+ break;
+ case 'website':
+ $this->showEditableWebsite($name, $field);
+ break;
+ case 'experience':
+ $this->showEditableExperience($name, $field);
+ break;
+ case 'education':
+ $this->showEditableEducation($name, $field);
+ break;
+ default:
+ $out->input($id, null, "TYPE: $type");
+ }
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit(
+ 'save',
+ _m('BUTTON','Save'),
+ 'submit form_action-secondary',
+ 'save',
+ _('Save details')
+ );
+ }
+
+ /**
+ * ID of the form
+ *
+ * @return string ID of the form
+ */
+
+ function id()
+ {
+ return 'profile-details-' . $this->profile->id;
+ }
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ return 'form_profile_details form_settings';
+ }
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('profiledetailsettings');
+ }
+}
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ExtendedProfilePlugin.php:40
-msgid "UI extensions for additional profile fields."
+#: actions/profiledetailsettings.php:29
+msgid "Extended profile settings"
+msgstr ""
+
+#. TRANS: Usage instructions for profile settings.
+#: actions/profiledetailsettings.php:40
+msgid ""
+"You can update your personal profile info here so people know more about you."
+msgstr ""
+
+#: actions/profiledetailsettings.php:63
+msgid "There was a problem with your session token. Try again, please."
+msgstr ""
+
+#. TRANS: Message given submitting a form with an unknown action.
+#: actions/profiledetailsettings.php:74
+msgid "Unexpected form submission."
+msgstr ""
+
+#: actions/profiledetailsettings.php:136
+msgid "Details saved."
+msgstr ""
+
+#. TRANS: Exception thrown when no date was entered in a required date field.
+#. TRANS: %s is the field name.
+#: actions/profiledetailsettings.php:147
+#, php-format
+msgid "You must supply a date for \"%s\"."
+msgstr ""
+
+#. TRANS: Exception thrown on incorrect data input.
+#. TRANS: %1$s is a field name, %2$s is the incorrect input.
+#: actions/profiledetailsettings.php:159
+#, php-format
+msgid "Invalid date entered for \"%1$s\": %2$s."
msgstr ""
-#. TRANS: Link description in user account settings menu.
-#: ExtendedProfilePlugin.php:108
-msgid "Details"
+#. TRANS: Exception thrown when entering an invalid URL.
+#. TRANS: %s is the invalid URL.
+#: actions/profiledetailsettings.php:275
+#, php-format
+msgid "Invalid URL: %s."
msgstr ""
-#: ExtendedProfilePlugin.php:116
+#: actions/profiledetailsettings.php:523 actions/profiledetailsettings.php:535
+msgid "Could not save profile details."
+msgstr ""
+
+#. TRANS: Validation error in form for profile settings.
+#. TRANS: %s is an invalid tag.
+#: actions/profiledetailsettings.php:580
+#, php-format
+msgid "Invalid tag: \"%s\"."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings could not be saved.
+#: actions/profiledetailsettings.php:622
+msgid "Could not save profile."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings tags could not be saved.
+#: actions/profiledetailsettings.php:631
+msgid "Could not save tags."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+#: actions/profiledetail.php:52
+msgid "Edit extended profile settings"
+msgstr ""
+
+#. TRANS: Link text for link on user profile.
+#: actions/profiledetail.php:54
+msgid "Edit"
+msgstr ""
+
+#: ExtendedProfilePlugin.php:41
+msgid "UI extensions for additional profile fields."
+msgstr ""
+
+#: ExtendedProfilePlugin.php:123
msgid "More details..."
msgstr ""
-#: extendedprofile.php:49 extendedprofile.php:103
-msgid "Personal"
+#: lib/extendedprofilewidget.php:317 lib/extendedprofilewidget.php:359
+msgid "Company"
msgstr ""
-#: extendedprofile.php:52
-msgid "Full name"
+#: lib/extendedprofilewidget.php:322 lib/extendedprofilewidget.php:366
+#: lib/extendedprofilewidget.php:407 lib/extendedprofilewidget.php:457
+msgid "Start"
msgstr ""
-#: extendedprofile.php:57
-msgid "Title"
+#: lib/extendedprofilewidget.php:329 lib/extendedprofilewidget.php:373
+#: lib/extendedprofilewidget.php:414 lib/extendedprofilewidget.php:464
+msgid "End"
msgstr ""
-#: extendedprofile.php:61
-msgid "Manager"
+#: lib/extendedprofilewidget.php:341 lib/extendedprofilewidget.php:387
+msgid "Current"
msgstr ""
-#: extendedprofile.php:66
-msgid "Location"
+#: lib/extendedprofilewidget.php:399 lib/extendedprofilewidget.php:435
+#: lib/extendedprofile.php:242 lib/extendedprofile.php:254
+msgid "Institution"
msgstr ""
-#: extendedprofile.php:70
-msgid "Bio"
+#: lib/extendedprofilewidget.php:403 lib/extendedprofilewidget.php:442
+msgid "Degree"
msgstr ""
-#: extendedprofile.php:75
-msgid "Tags"
+#: lib/extendedprofilewidget.php:405 lib/extendedprofilewidget.php:449
+msgid "Description"
msgstr ""
-#: extendedprofile.php:82
-msgid "Contact"
+#: lib/extendedprofilewidget.php:618
+msgctxt "BUTTON"
+msgid "Save"
msgstr ""
-#: extendedprofile.php:85
+#: lib/extendedprofile.php:119 lib/extendedprofile.php:129
msgid "Phone"
msgstr ""
-#: extendedprofile.php:91
+#: lib/extendedprofile.php:150 lib/extendedprofile.php:156
msgid "IM"
msgstr ""
-#: extendedprofile.php:96
-msgid "Websites"
+#: lib/extendedprofile.php:176 lib/extendedprofile.php:182
+msgid "Website"
msgstr ""
-#: extendedprofile.php:106
-msgid "Birthday"
+#: lib/extendedprofile.php:205 lib/extendedprofile.php:216
+msgid "Employer"
msgstr ""
-#: extendedprofile.php:111
-msgid "Spouse's name"
+#: lib/extendedprofile.php:278 lib/extendedprofile.php:319
+msgid "Personal"
msgstr ""
-#: extendedprofile.php:115
-msgid "Kids' names"
+#: lib/extendedprofile.php:281
+msgid "Full name"
msgstr ""
-#: extendedprofile.php:120
-msgid "Work experience"
+#: lib/extendedprofile.php:286
+msgid "Title"
msgstr ""
-#: extendedprofile.php:124
-msgid "Employer"
+#: lib/extendedprofile.php:290
+msgid "Manager"
msgstr ""
-#: extendedprofile.php:129
-msgid "Education"
+#: lib/extendedprofile.php:295
+msgid "Location"
msgstr ""
-#: extendedprofile.php:133
-msgid "Institution"
+#: lib/extendedprofile.php:299
+msgid "Bio"
msgstr ""
-#. TRANS: Link title for link on user profile.
-#: profiledetailaction.php:61
-msgid "Edit extended profile settings"
+#: lib/extendedprofile.php:304
+msgid "Tags"
msgstr ""
-#. TRANS: Link text for link on user profile.
-#: profiledetailaction.php:63
-msgid "Edit"
+#: lib/extendedprofile.php:311
+msgid "Contact"
msgstr ""
-#: profiledetailsettingsaction.php:29
-msgid "Extended profile settings"
+#: lib/extendedprofile.php:322
+msgid "Birthday"
+msgstr ""
+
+#: lib/extendedprofile.php:327
+msgid "Spouse's name"
+msgstr ""
+
+#: lib/extendedprofile.php:331
+msgid "Kids' names"
+msgstr ""
+
+#: lib/extendedprofile.php:336
+msgid "Work experience"
+msgstr ""
+
+#: lib/extendedprofile.php:342
+msgid "Education"
msgstr ""
msgstr ""
"Project-Id-Version: StatusNet - ExtendedProfile\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:37:09+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:58+0000\n"
"Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 20:42:39+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-17 10:19:30+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: br\n"
"X-Message-Group: #out-statusnet-plugin-extendedprofile\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-msgid "UI extensions for additional profile fields."
+msgid "Extended profile settings"
+msgstr "Arventennoù ledanet ar profil"
+
+#. TRANS: Usage instructions for profile settings.
+msgid ""
+"You can update your personal profile info here so people know more about you."
+msgstr ""
+
+msgid "There was a problem with your session token. Try again, please."
+msgstr ""
+
+#. TRANS: Message given submitting a form with an unknown action.
+msgid "Unexpected form submission."
+msgstr ""
+
+msgid "Details saved."
+msgstr ""
+
+#. TRANS: Exception thrown when no date was entered in a required date field.
+#. TRANS: %s is the field name.
+#, php-format
+msgid "You must supply a date for \"%s\"."
+msgstr ""
+
+#. TRANS: Exception thrown on incorrect data input.
+#. TRANS: %1$s is a field name, %2$s is the incorrect input.
+#, php-format
+msgid "Invalid date entered for \"%1$s\": %2$s."
+msgstr ""
+
+#. TRANS: Exception thrown when entering an invalid URL.
+#. TRANS: %s is the invalid URL.
+#, php-format
+msgid "Invalid URL: %s."
+msgstr ""
+
+msgid "Could not save profile details."
+msgstr ""
+
+#. TRANS: Validation error in form for profile settings.
+#. TRANS: %s is an invalid tag.
+#, php-format
+msgid "Invalid tag: \"%s\"."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings could not be saved.
+msgid "Could not save profile."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings tags could not be saved.
+msgid "Could not save tags."
msgstr ""
-#. TRANS: Link description in user account settings menu.
-msgid "Details"
-msgstr "Munudoù"
+#. TRANS: Link title for link on user profile.
+msgid "Edit extended profile settings"
+msgstr "Aozañ arventennoù ledanet ar profil"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Aozañ"
+
+msgid "UI extensions for additional profile fields."
+msgstr ""
msgid "More details..."
msgstr "Muoic'h a vunudoù..."
+msgid "Company"
+msgstr ""
+
+msgid "Start"
+msgstr ""
+
+msgid "End"
+msgstr ""
+
+msgid "Current"
+msgstr ""
+
+msgid "Institution"
+msgstr "Ensavadur"
+
+msgid "Degree"
+msgstr ""
+
+msgid "Description"
+msgstr ""
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr ""
+
+msgid "Phone"
+msgstr "Pellgomz"
+
+msgid "IM"
+msgstr "IM"
+
+#, fuzzy
+msgid "Website"
+msgstr "Lec'hiennoù web"
+
+msgid "Employer"
+msgstr ""
+
msgid "Personal"
msgstr "Personel"
msgid "Contact"
msgstr "Darempred"
-msgid "Phone"
-msgstr "Pellgomz"
-
-msgid "IM"
-msgstr "IM"
-
-msgid "Websites"
-msgstr "Lec'hiennoù web"
-
msgid "Birthday"
msgstr "Deiz-ha-bloaz"
msgid "Work experience"
msgstr "Skiant-prenet"
-msgid "Employer"
-msgstr ""
-
msgid "Education"
msgstr "Deskadurezh"
-
-msgid "Institution"
-msgstr "Ensavadur"
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit extended profile settings"
-msgstr "Aozañ arventennoù ledanet ar profil"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Aozañ"
-
-msgid "Extended profile settings"
-msgstr "Arventennoù ledanet ar profil"
msgstr ""
"Project-Id-Version: StatusNet - ExtendedProfile\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:37:09+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:58+0000\n"
"Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 20:42:39+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-17 10:19:30+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ia\n"
"X-Message-Group: #out-statusnet-plugin-extendedprofile\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgid "Extended profile settings"
+msgstr "Configuration extendite del profilo"
+
+#. TRANS: Usage instructions for profile settings.
+msgid ""
+"You can update your personal profile info here so people know more about you."
+msgstr ""
+
+msgid "There was a problem with your session token. Try again, please."
+msgstr ""
+
+#. TRANS: Message given submitting a form with an unknown action.
+msgid "Unexpected form submission."
+msgstr ""
+
+msgid "Details saved."
+msgstr ""
+
+#. TRANS: Exception thrown when no date was entered in a required date field.
+#. TRANS: %s is the field name.
+#, php-format
+msgid "You must supply a date for \"%s\"."
+msgstr ""
+
+#. TRANS: Exception thrown on incorrect data input.
+#. TRANS: %1$s is a field name, %2$s is the incorrect input.
+#, php-format
+msgid "Invalid date entered for \"%1$s\": %2$s."
+msgstr ""
+
+#. TRANS: Exception thrown when entering an invalid URL.
+#. TRANS: %s is the invalid URL.
+#, php-format
+msgid "Invalid URL: %s."
+msgstr ""
+
+msgid "Could not save profile details."
+msgstr ""
+
+#. TRANS: Validation error in form for profile settings.
+#. TRANS: %s is an invalid tag.
+#, php-format
+msgid "Invalid tag: \"%s\"."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings could not be saved.
+msgid "Could not save profile."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings tags could not be saved.
+msgid "Could not save tags."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit extended profile settings"
+msgstr "Modificar configuration extendite del profilo"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Modificar"
+
msgid "UI extensions for additional profile fields."
msgstr "Extensiones del IU pro additional campos de profilo."
-#. TRANS: Link description in user account settings menu.
-msgid "Details"
-msgstr "Detalios"
-
msgid "More details..."
msgstr "Plus detalios..."
+msgid "Company"
+msgstr ""
+
+msgid "Start"
+msgstr ""
+
+msgid "End"
+msgstr ""
+
+msgid "Current"
+msgstr ""
+
+msgid "Institution"
+msgstr "Institution"
+
+msgid "Degree"
+msgstr ""
+
+msgid "Description"
+msgstr ""
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr ""
+
+msgid "Phone"
+msgstr "Telephono"
+
+msgid "IM"
+msgstr "MI"
+
+#, fuzzy
+msgid "Website"
+msgstr "Sitos web"
+
+msgid "Employer"
+msgstr "Empleator"
+
msgid "Personal"
msgstr "Personal"
msgid "Contact"
msgstr "Contacto"
-msgid "Phone"
-msgstr "Telephono"
-
-msgid "IM"
-msgstr "MI"
-
-msgid "Websites"
-msgstr "Sitos web"
-
msgid "Birthday"
msgstr "Anniversario"
msgid "Work experience"
msgstr "Experientia professional"
-msgid "Employer"
-msgstr "Empleator"
-
msgid "Education"
msgstr "Education"
-
-msgid "Institution"
-msgstr "Institution"
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit extended profile settings"
-msgstr "Modificar configuration extendite del profilo"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Modificar"
-
-msgid "Extended profile settings"
-msgstr "Configuration extendite del profilo"
msgstr ""
"Project-Id-Version: StatusNet - ExtendedProfile\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:37:09+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:58+0000\n"
"Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 20:42:39+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-17 10:19:30+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: mk\n"
"X-Message-Group: #out-statusnet-plugin-extendedprofile\n"
"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"
+msgid "Extended profile settings"
+msgstr "Проширени профилни нагодувања"
+
+#. TRANS: Usage instructions for profile settings.
+msgid ""
+"You can update your personal profile info here so people know more about you."
+msgstr ""
+
+msgid "There was a problem with your session token. Try again, please."
+msgstr ""
+
+#. TRANS: Message given submitting a form with an unknown action.
+msgid "Unexpected form submission."
+msgstr ""
+
+msgid "Details saved."
+msgstr ""
+
+#. TRANS: Exception thrown when no date was entered in a required date field.
+#. TRANS: %s is the field name.
+#, php-format
+msgid "You must supply a date for \"%s\"."
+msgstr ""
+
+#. TRANS: Exception thrown on incorrect data input.
+#. TRANS: %1$s is a field name, %2$s is the incorrect input.
+#, php-format
+msgid "Invalid date entered for \"%1$s\": %2$s."
+msgstr ""
+
+#. TRANS: Exception thrown when entering an invalid URL.
+#. TRANS: %s is the invalid URL.
+#, php-format
+msgid "Invalid URL: %s."
+msgstr ""
+
+msgid "Could not save profile details."
+msgstr ""
+
+#. TRANS: Validation error in form for profile settings.
+#. TRANS: %s is an invalid tag.
+#, php-format
+msgid "Invalid tag: \"%s\"."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings could not be saved.
+msgid "Could not save profile."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings tags could not be saved.
+msgid "Could not save tags."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit extended profile settings"
+msgstr "Уреди проширени профилни нагодувања"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Уреди"
+
msgid "UI extensions for additional profile fields."
msgstr "Посреднички дадатоци за дополнителни полиња во профилот."
-#. TRANS: Link description in user account settings menu.
-msgid "Details"
-msgstr "Подробности"
-
msgid "More details..."
msgstr "Поподробно..."
+msgid "Company"
+msgstr ""
+
+msgid "Start"
+msgstr ""
+
+msgid "End"
+msgstr ""
+
+msgid "Current"
+msgstr ""
+
+msgid "Institution"
+msgstr "Установа"
+
+msgid "Degree"
+msgstr ""
+
+msgid "Description"
+msgstr ""
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr ""
+
+msgid "Phone"
+msgstr "Телефон"
+
+msgid "IM"
+msgstr "IM"
+
+#, fuzzy
+msgid "Website"
+msgstr "Мрежни места"
+
+msgid "Employer"
+msgstr "Работодавач"
+
msgid "Personal"
msgstr "Лично"
msgid "Contact"
msgstr "Контакт"
-msgid "Phone"
-msgstr "Телефон"
-
-msgid "IM"
-msgstr "IM"
-
-msgid "Websites"
-msgstr "Мрежни места"
-
msgid "Birthday"
msgstr "Роденден"
msgid "Work experience"
msgstr "Работно искуство"
-msgid "Employer"
-msgstr "Работодавач"
-
msgid "Education"
msgstr "Образование"
-
-msgid "Institution"
-msgstr "Установа"
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit extended profile settings"
-msgstr "Уреди проширени профилни нагодувања"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Уреди"
-
-msgid "Extended profile settings"
-msgstr "Проширени профилни нагодувања"
msgstr ""
"Project-Id-Version: StatusNet - ExtendedProfile\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:37:09+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:58+0000\n"
"Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 20:42:39+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-17 10:19:30+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: nl\n"
"X-Message-Group: #out-statusnet-plugin-extendedprofile\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgid "Extended profile settings"
+msgstr "Uitgebreide profielinstellingen"
+
+#. TRANS: Usage instructions for profile settings.
+msgid ""
+"You can update your personal profile info here so people know more about you."
+msgstr ""
+
+msgid "There was a problem with your session token. Try again, please."
+msgstr ""
+"Er is een probleem ontstaan met uw sessie. Probeer het nog een keer, "
+"alstublieft."
+
+#. TRANS: Message given submitting a form with an unknown action.
+msgid "Unexpected form submission."
+msgstr "Het formulier is onverwacht ingezonden."
+
+msgid "Details saved."
+msgstr ""
+
+#. TRANS: Exception thrown when no date was entered in a required date field.
+#. TRANS: %s is the field name.
+#, php-format
+msgid "You must supply a date for \"%s\"."
+msgstr "U moet een datum opgeven voor \"%s\"."
+
+#. TRANS: Exception thrown on incorrect data input.
+#. TRANS: %1$s is a field name, %2$s is the incorrect input.
+#, fuzzy, php-format
+msgid "Invalid date entered for \"%1$s\": %2$s."
+msgstr "Er is een ongeldige datum opgegeven voor \"%s\": %s."
+
+#. TRANS: Exception thrown when entering an invalid URL.
+#. TRANS: %s is the invalid URL.
+#, fuzzy, php-format
+msgid "Invalid URL: %s."
+msgstr "Ongeldige URL: %s."
+
+msgid "Could not save profile details."
+msgstr "Het was niet mogelijk de profielgegevens op te slaan."
+
+#. TRANS: Validation error in form for profile settings.
+#. TRANS: %s is an invalid tag.
+#, php-format
+msgid "Invalid tag: \"%s\"."
+msgstr "Ongeldig label: \"%s\"."
+
+#. TRANS: Server error thrown when user profile settings could not be saved.
+#, fuzzy
+msgid "Could not save profile."
+msgstr "Het was niet mogelijk de profielgegevens op te slaan."
+
+#. TRANS: Server error thrown when user profile settings tags could not be saved.
+#, fuzzy
+msgid "Could not save tags."
+msgstr "Het was niet mogelijk de profielgegevens op te slaan."
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit extended profile settings"
+msgstr "Uitgebreide profielinstellingen bewerken"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Bewerken"
+
msgid "UI extensions for additional profile fields."
msgstr "UI-uitbreidingen voor extra profielvelden."
-#. TRANS: Link description in user account settings menu.
-msgid "Details"
-msgstr "Details"
-
msgid "More details..."
msgstr "Meer details..."
+msgid "Company"
+msgstr "Bedrijf"
+
+msgid "Start"
+msgstr "Begin"
+
+msgid "End"
+msgstr "Eind"
+
+msgid "Current"
+msgstr "Huidig"
+
+msgid "Institution"
+msgstr "Instelling"
+
+msgid "Degree"
+msgstr "Graad"
+
+msgid "Description"
+msgstr "Beschrijving"
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Opslaan"
+
+msgid "Phone"
+msgstr "Telefoonnummer"
+
+msgid "IM"
+msgstr "IM"
+
+msgid "Website"
+msgstr "Website"
+
+msgid "Employer"
+msgstr "Werkgever"
+
msgid "Personal"
msgstr "Persoonlijk"
msgid "Contact"
msgstr "Contact"
-msgid "Phone"
-msgstr "Telefoonnummer"
-
-msgid "IM"
-msgstr "IM"
-
-msgid "Websites"
-msgstr "Websites"
-
msgid "Birthday"
msgstr "Geboortedatum"
msgid "Work experience"
msgstr "Werkervaring"
-msgid "Employer"
-msgstr "Werkgever"
-
msgid "Education"
msgstr "Opleiding"
-
-msgid "Institution"
-msgstr "Instelling"
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit extended profile settings"
-msgstr "Uitgebreide profielinstellingen bewerken"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Bewerken"
-
-msgid "Extended profile settings"
-msgstr "Uitgebreide profielinstellingen"
--- /dev/null
+# Translation of StatusNet - ExtendedProfile to Swedish (Svenska)
+# Exported from translatewiki.net
+#
+# Author: WikiPhoenix
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - ExtendedProfile\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:58+0000\n"
+"Language-Team: Swedish <http://translatewiki.net/wiki/Portal:sv>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-17 10:19:30+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: sv\n"
+"X-Message-Group: #out-statusnet-plugin-extendedprofile\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Extended profile settings"
+msgstr "Utökade profilinställningar"
+
+#. TRANS: Usage instructions for profile settings.
+msgid ""
+"You can update your personal profile info here so people know more about you."
+msgstr ""
+
+msgid "There was a problem with your session token. Try again, please."
+msgstr ""
+
+#. TRANS: Message given submitting a form with an unknown action.
+msgid "Unexpected form submission."
+msgstr ""
+
+msgid "Details saved."
+msgstr ""
+
+#. TRANS: Exception thrown when no date was entered in a required date field.
+#. TRANS: %s is the field name.
+#, php-format
+msgid "You must supply a date for \"%s\"."
+msgstr ""
+
+#. TRANS: Exception thrown on incorrect data input.
+#. TRANS: %1$s is a field name, %2$s is the incorrect input.
+#, php-format
+msgid "Invalid date entered for \"%1$s\": %2$s."
+msgstr ""
+
+#. TRANS: Exception thrown when entering an invalid URL.
+#. TRANS: %s is the invalid URL.
+#, php-format
+msgid "Invalid URL: %s."
+msgstr ""
+
+msgid "Could not save profile details."
+msgstr ""
+
+#. TRANS: Validation error in form for profile settings.
+#. TRANS: %s is an invalid tag.
+#, php-format
+msgid "Invalid tag: \"%s\"."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings could not be saved.
+msgid "Could not save profile."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings tags could not be saved.
+msgid "Could not save tags."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit extended profile settings"
+msgstr "Redigera utökade profilinställningar"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Redigera"
+
+msgid "UI extensions for additional profile fields."
+msgstr ""
+
+msgid "More details..."
+msgstr "Mer detaljer..."
+
+msgid "Company"
+msgstr ""
+
+msgid "Start"
+msgstr ""
+
+msgid "End"
+msgstr ""
+
+msgid "Current"
+msgstr ""
+
+msgid "Institution"
+msgstr "Institution"
+
+msgid "Degree"
+msgstr ""
+
+msgid "Description"
+msgstr ""
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr ""
+
+msgid "Phone"
+msgstr "Telefon"
+
+msgid "IM"
+msgstr ""
+
+#, fuzzy
+msgid "Website"
+msgstr "Webbsidor"
+
+msgid "Employer"
+msgstr "Arbetsgivare"
+
+msgid "Personal"
+msgstr "Personlig"
+
+msgid "Full name"
+msgstr "Fullt namn"
+
+msgid "Title"
+msgstr "Titel"
+
+msgid "Manager"
+msgstr ""
+
+msgid "Location"
+msgstr "Ort"
+
+msgid "Bio"
+msgstr ""
+
+msgid "Tags"
+msgstr "Taggar"
+
+msgid "Contact"
+msgstr "Kontakt"
+
+msgid "Birthday"
+msgstr "Födelsedag"
+
+msgid "Spouse's name"
+msgstr "Partnerns namn"
+
+msgid "Kids' names"
+msgstr "Barnens namn"
+
+msgid "Work experience"
+msgstr "Arbetserfarenhet"
+
+msgid "Education"
+msgstr "Utbildning"
--- /dev/null
+# Translation of StatusNet - ExtendedProfile to Telugu (తెలుగు)
+# Exported from translatewiki.net
+#
+# Author: Veeven
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - ExtendedProfile\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:50:37+0000\n"
+"Language-Team: Telugu <http://translatewiki.net/wiki/Portal:te>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:53:18+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: te\n"
+"X-Message-Group: #out-statusnet-plugin-extendedprofile\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Extended profile settings"
+msgstr ""
+
+msgid "There was a problem with your session token. Try again, please."
+msgstr ""
+
+#. TRANS: Message given submitting a form with an unknown action
+msgid "Unexpected form submission."
+msgstr ""
+
+#, php-format
+msgid "You must supply a date for \"%s\"."
+msgstr ""
+
+#, php-format
+msgid "Invalid date entered for \"%s\": %s"
+msgstr ""
+
+#, php-format
+msgid "Invalid URL: %s"
+msgstr ""
+
+msgid "Could not save profile details."
+msgstr ""
+
+#. TRANS: Validation error in form for profile settings.
+#. TRANS: %s is an invalid tag.
+#, php-format
+msgid "Invalid tag: \"%s\"."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit extended profile settings"
+msgstr ""
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "మార్చు"
+
+msgid "UI extensions for additional profile fields."
+msgstr ""
+
+msgid "More details..."
+msgstr "మరిన్ని వివరాలు..."
+
+msgid "Company"
+msgstr ""
+
+msgid "Start"
+msgstr ""
+
+msgid "End"
+msgstr ""
+
+msgid "Current"
+msgstr ""
+
+msgid "Institution"
+msgstr ""
+
+msgid "Degree"
+msgstr ""
+
+msgid "Description"
+msgstr ""
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr ""
+
+msgid "Phone"
+msgstr ""
+
+msgid "IM"
+msgstr ""
+
+#, fuzzy
+msgid "Website"
+msgstr "జాలగూళ్ళు"
+
+msgid "Employer"
+msgstr ""
+
+msgid "Personal"
+msgstr "వ్యక్తిగతం"
+
+msgid "Full name"
+msgstr "పూర్తి పేరు"
+
+msgid "Title"
+msgstr "శీర్షిక"
+
+msgid "Manager"
+msgstr ""
+
+msgid "Location"
+msgstr "ప్రాంతం"
+
+msgid "Bio"
+msgstr ""
+
+msgid "Tags"
+msgstr "ట్యాగులు"
+
+msgid "Contact"
+msgstr "సంప్రదించండి"
+
+msgid "Birthday"
+msgstr "పుట్టినరోజు"
+
+msgid "Spouse's name"
+msgstr ""
+
+msgid "Kids' names"
+msgstr "పిల్లల పేర్లు"
+
+msgid "Work experience"
+msgstr "ఉద్యోగ అనుభవం"
+
+msgid "Education"
+msgstr "చదువు"
+
+#~ msgid "Details"
+#~ msgstr "వివరాలు"
msgstr ""
"Project-Id-Version: StatusNet - ExtendedProfile\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-08 01:03+0000\n"
-"PO-Revision-Date: 2011-03-08 01:06:03+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:38:58+0000\n"
"Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-06 02:17:22+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
+"X-POT-Import-Date: 2011-03-17 10:19:30+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: uk\n"
"X-Message-Group: #out-statusnet-plugin-extendedprofile\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"
+msgid "Extended profile settings"
+msgstr "Розширені налаштування профілю"
+
+#. TRANS: Usage instructions for profile settings.
+msgid ""
+"You can update your personal profile info here so people know more about you."
+msgstr ""
+
+msgid "There was a problem with your session token. Try again, please."
+msgstr ""
+
+#. TRANS: Message given submitting a form with an unknown action.
+msgid "Unexpected form submission."
+msgstr ""
+
+msgid "Details saved."
+msgstr ""
+
+#. TRANS: Exception thrown when no date was entered in a required date field.
+#. TRANS: %s is the field name.
+#, php-format
+msgid "You must supply a date for \"%s\"."
+msgstr ""
+
+#. TRANS: Exception thrown on incorrect data input.
+#. TRANS: %1$s is a field name, %2$s is the incorrect input.
+#, php-format
+msgid "Invalid date entered for \"%1$s\": %2$s."
+msgstr ""
+
+#. TRANS: Exception thrown when entering an invalid URL.
+#. TRANS: %s is the invalid URL.
+#, php-format
+msgid "Invalid URL: %s."
+msgstr ""
+
+msgid "Could not save profile details."
+msgstr ""
+
+#. TRANS: Validation error in form for profile settings.
+#. TRANS: %s is an invalid tag.
+#, php-format
+msgid "Invalid tag: \"%s\"."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings could not be saved.
+msgid "Could not save profile."
+msgstr ""
+
+#. TRANS: Server error thrown when user profile settings tags could not be saved.
+msgid "Could not save tags."
+msgstr ""
+
+#. TRANS: Link title for link on user profile.
+msgid "Edit extended profile settings"
+msgstr "Змінити розширені налаштування профілю"
+
+#. TRANS: Link text for link on user profile.
+msgid "Edit"
+msgstr "Змінити"
+
msgid "UI extensions for additional profile fields."
msgstr "Розширення інтерфейсу для додаткових полів у профілі."
-#. TRANS: Link description in user account settings menu.
-msgid "Details"
-msgstr "Деталі"
-
msgid "More details..."
msgstr "Детальніше..."
+msgid "Company"
+msgstr ""
+
+msgid "Start"
+msgstr ""
+
+msgid "End"
+msgstr ""
+
+msgid "Current"
+msgstr ""
+
+msgid "Institution"
+msgstr "Установа"
+
+msgid "Degree"
+msgstr ""
+
+msgid "Description"
+msgstr ""
+
+msgctxt "BUTTON"
+msgid "Save"
+msgstr ""
+
+msgid "Phone"
+msgstr "Телефон"
+
+msgid "IM"
+msgstr "ІМ"
+
+#, fuzzy
+msgid "Website"
+msgstr "Сайти"
+
+msgid "Employer"
+msgstr "Роботодавець"
+
msgid "Personal"
msgstr "Профіль"
msgid "Contact"
msgstr "Контакти"
-msgid "Phone"
-msgstr "Телефон"
-
-msgid "IM"
-msgstr "ІМ"
-
-msgid "Websites"
-msgstr "Сайти"
-
msgid "Birthday"
msgstr "День народження"
msgid "Work experience"
msgstr "Досвід роботи"
-msgid "Employer"
-msgstr "Роботодавець"
-
msgid "Education"
msgstr "Освіта"
-
-msgid "Institution"
-msgstr "Установа"
-
-#. TRANS: Link title for link on user profile.
-msgid "Edit extended profile settings"
-msgstr "Змінити розширені налаштування профілю"
-
-#. TRANS: Link text for link on user profile.
-msgid "Edit"
-msgstr "Змінити"
-
-msgid "Extended profile settings"
-msgstr "Розширені налаштування профілю"
+++ /dev/null
-/* Note the #content is only needed to override weird crap in default styles */
-
-#content table.extended-profile {
- width: 100%;
- border-collapse: separate;
- border-spacing: 8px;
-}
-#content table.extended-profile th {
- color: #777;
- background-color: #eee;
- width: 150px;
-
- padding-top: 0; /* override bizarre theme defaults */
-
- text-align: right;
- padding-right: 8px;
-}
-#content table.extended-profile td {
- padding: 0; /* override bizarre theme defaults */
-
- padding-left: 8px;
-}
\ No newline at end of file
+++ /dev/null
-<?php
-/*
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2011, StatusNet, Inc.
- *
- * 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/>.
- */
-
-if (!defined('STATUSNET')) {
- exit(1);
-}
-
-class ProfileDetailAction extends ProfileAction
-{
- function isReadOnly($args)
- {
- return true;
- }
-
- function title()
- {
- return $this->profile->getFancyName();
- }
-
- function showLocalNav()
- {
- $nav = new PersonalGroupNav($this);
- $nav->show();
- }
-
- function showStylesheets() {
- parent::showStylesheets();
- $this->cssLink('plugins/ExtendedProfile/profiledetail.css');
- return true;
- }
-
- function handle($args)
- {
- $this->showPage();
- }
-
- function showContent()
- {
- $cur = common_current_user();
- if ($cur && $cur->id == $this->profile->id) { // your own page
- $this->elementStart('div', 'entity_actions');
- $this->elementStart('li', 'entity_edit');
- $this->element('a', array('href' => common_local_url('profiledetailsettings'),
- // TRANS: Link title for link on user profile.
- 'title' => _m('Edit extended profile settings')),
- // TRANS: Link text for link on user profile.
- _m('Edit'));
- $this->elementEnd('li');
- $this->elementEnd('div');
- }
-
- $widget = new ExtendedProfileWidget($this, $this->profile);
- $widget->show();
- }
-}
+++ /dev/null
-<?php
-/*
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2011, StatusNet, Inc.
- *
- * 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/>.
- */
-
-if (!defined('STATUSNET')) {
- exit(1);
-}
-
-class ProfileDetailSettingsAction extends AccountSettingsAction
-{
-
- function title()
- {
- return _m('Extended profile settings');
- }
-
- /**
- * Instructions for use
- *
- * @return instructions for use
- */
- function getInstructions()
- {
- // TRANS: Usage instructions for profile settings.
- return _('You can update your personal profile info here '.
- 'so people know more about you.');
- }
-
- function showStylesheets() {
- parent::showStylesheets();
- $this->cssLink('plugins/ExtendedProfile/profiledetail.css');
- return true;
- }
-
- function handle($args)
- {
- $this->showPage();
- }
-
- function showContent()
- {
- $cur = common_current_user();
- $profile = $cur->getProfile();
-
- $widget = new ExtendedProfileWidget($this, $profile, ExtendedProfileWidget::EDITABLE);
- $widget->show();
- }
-}
--- /dev/null
+# Translation of StatusNet - Irc to Swedish (Svenska)
+# Exported from translatewiki.net
+#
+# Author: WikiPhoenix
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Irc\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:18:23+0000\n"
+"Language-Team: Swedish <http://translatewiki.net/wiki/Portal:sv>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-08 01:22:54+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: sv\n"
+"X-Message-Group: #out-statusnet-plugin-irc\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "IRC"
+msgstr "IRC"
+
+msgid ""
+"The IRC plugin allows users to send and receive notices over an IRC network."
+msgstr ""
+"IRC-tillägget tillåter användare skicka och ta emot meddelanden över IRC-"
+"nätverket."
+
+#, php-format
+msgid "Could not increment attempts count for %d"
+msgstr ""
+
+msgid "Your nickname is not registered so IRC connectivity cannot be enabled"
+msgstr ""
+"Ditt smeknamn är inte registrerat, så IRC-anslutningar kan inte aktiveras"
msgstr ""
"Project-Id-Version: StatusNet - MobileProfile\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:37:37+0000\n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:18:38+0000\n"
"Language-Team: Telugu <http://translatewiki.net/wiki/Portal:te>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 17:49:34+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-08 01:22:09+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: te\n"
"X-Message-Group: #out-statusnet-plugin-mobileprofile\n"
msgstr "వెతుకు"
msgid "Attach"
-msgstr ""
+msgstr "జోడించు"
msgid "Attach a file"
-msgstr ""
+msgstr "ఒక దస్త్రాన్ని జోడించండి"
#. TRANS: Link to switch site layout from mobile to desktop mode. Appears at very bottom of page.
msgid "Switch to desktop site layout."
--- /dev/null
+# Translation of StatusNet - Msn to Greek (Ελληνικά)
+# Exported from translatewiki.net
+#
+# Author: Evropi
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Msn\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:51:13+0000\n"
+"Language-Team: Greek <http://translatewiki.net/wiki/Portal:el>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:53:22+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: el\n"
+"X-Message-Group: #out-statusnet-plugin-msn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "MSN"
+msgstr "MSN"
+
+msgid ""
+"The MSN plugin allows users to send and receive notices over the MSN network."
+msgstr ""
--- /dev/null
+# Translation of StatusNet - Msn to Swedish (Svenska)
+# Exported from translatewiki.net
+#
+# Author: WikiPhoenix
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Msn\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:18:41+0000\n"
+"Language-Team: Swedish <http://translatewiki.net/wiki/Portal:sv>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-08 01:22:11+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: sv\n"
+"X-Message-Group: #out-statusnet-plugin-msn\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "MSN"
+msgstr "MSN"
+
+msgid ""
+"The MSN plugin allows users to send and receive notices over the MSN network."
+msgstr ""
+"MSN-tillägget tillåter användare skicka och ta emot meddelanden över MSN-"
+"nätverket."
function showNoticeForm()
{
}
+
+ function showProfileBlock()
+ {
+ }
}
# Exported from translatewiki.net
#
# Author: Fujnky
+# Author: George Animal
# Author: The Evil IP address
# --
# This file is distributed under the same license as the StatusNet package.
msgstr ""
"Project-Id-Version: StatusNet - OpenX\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:37:51+0000\n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:18:54+0000\n"
"Language-Team: German <http://translatewiki.net/wiki/Portal:de>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 17:45:43+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-06 02:18:35+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: de\n"
"X-Message-Group: #out-statusnet-plugin-openx\n"
#. TRANS: Form label in OpenX admin panel. Refers to advertisement format.
msgid "Rectangle"
-msgstr ""
+msgstr "Rechteck"
#. TRANS: Tooltip for form label in OpenX admin panel. Refers to advertisement format.
msgid "Rectangle zone"
* @return User_greeting_count object found, or null for no hits
*
*/
-
function staticGet($k, $v=null)
{
return Memcached_DataObject::staticGet('Poll', $k, $v);
* @return Bookmark object found, or null for no hits
*
*/
-
function pkeyGet($kv)
{
return Memcached_DataObject::pkeyGet('Poll', $kv);
*
* @return Poll found poll or null
*/
-
function getByNotice($notice)
{
return self::staticGet('uri', $notice->uri);
*
* @return Notice saved notice
*/
-
static function saveNew($profile, $question, $opts, $options=null)
{
if (empty($options)) {
common_log(LOG_DEBUG, "Saving poll: $p->id $p->uri");
$p->insert();
- $content = sprintf(_m('Poll: %s %s'),
+ // TRANS: Notice content creating a poll.
+ // TRANS: %1$s is the poll question, %2$s is a link to the poll.
+ $content = sprintf(_m('Poll: %1$s %2$s'),
$question,
$p->uri);
- $rendered = sprintf(_m('Poll: <a href="%s">%s</a>'),
- htmlspecialchars($p->uri),
- htmlspecialchars($question));
+ $link = '<a href="' . htmlspecialchars($p->uri) . '">' . htmlspecialchars($question) . '</a>';
+ // TRANS: Rendered version of the notice content creating a poll.
+ // TRANS: %s a link to the poll with the question as link description.
+ $rendered = sprintf(_m('Poll: %s'), $link);
$tags = array('poll');
$replies = array();
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
-
class PollPlugin extends MicroAppPlugin
{
const VERSION = '0.1';
// @fixme which domain should we use for these namespaces?
- const POLL_OBJECT = 'http://apinamespace.org/activitystreams/object/poll';
- const POLL_RESPONSE_OBJECT = 'http://apinamespace.org/activitystreams/object/poll-response';
+ const POLL_OBJECT = 'http://activityschema.org/object/poll';
+ const POLL_RESPONSE_OBJECT = 'http://activityschema.org/object/poll-response';
/**
* Database schema setup
*
* @return boolean hook value; true means continue processing, false means stop.
*/
-
function onCheckSchema()
{
$schema = Schema::get();
*
* @return boolean hook value
*/
-
function onEndShowStyles($action)
{
$action->cssLink($this->path('poll.css'));
*
* @return boolean hook value; true means continue processing, false means stop.
*/
-
function onAutoload($cls)
{
$dir = dirname(__FILE__);
*
* @return boolean hook value; true means continue processing, false means stop.
*/
-
function onRouterInitialized($m)
{
$m->connect('main/poll/new',
*
* @return value
*/
-
function onPluginVersion(&$versions)
{
$versions[] = array('name' => 'Poll',
'author' => 'Brion Vibber',
'homepage' => 'http://status.net/wiki/Plugin:Poll',
'rawdescription' =>
+ // TRANS: Plugin description.
_m('Simple extension for supporting basic polls.'));
return true;
}
*
* @return boolean hook value
*/
-
function deleteRelated($notice)
{
$p = Poll::getByNotice($notice);
*
* @return Notice resulting notice
*/
-
function saveNoticeFromActivity($activity, $profile, $options=array())
{
// @fixme
$pollElements = $activity->entry->getElementsByTagNameNS(self::POLL_OBJECT, 'poll');
$responseElements = $activity->entry->getElementsByTagNameNS(self::POLL_OBJECT, 'response');
if ($pollElements->length) {
- $data = $pollElements->item(0);
- $question = $data->getAttribute('question');
+ $question = '';
$opts = array();
- foreach ($data->attributes as $node) {
- $name = $node->nodeName;
- if (substr($name, 0, 6) == 'option') {
- $n = intval(substr($name, 6));
- if ($n > 0) {
- $opts[$n - 1] = $node->nodeValue;
- }
- }
+
+ $data = $pollElements->item(0);
+ foreach ($data->getElementsByTagNameNS(self::POLL_OBJECT, 'question') as $node) {
+ $question = $node->textContent;
+ }
+ foreach ($data->getElementsByTagNameNS(self::POLL_OBJECT, 'option') as $node) {
+ $opts[] = $node->textContent;
}
- common_log(LOG_DEBUG, "YYY question: $question");
- common_log(LOG_DEBUG, "YYY opts: " . var_export($opts, true));
try {
$notice = Poll::saveNew($profile, $question, $opts, $options);
- common_log(LOG_DEBUG, "YYY ok: " . $notice->id);
+ common_log(LOG_DEBUG, "Saved Poll from ActivityStream data ok: notice id " . $notice->id);
return $notice;
} catch (Exception $e) {
- common_log(LOG_DEBUG, "YYY fail: " . $e->getMessage());
+ common_log(LOG_DEBUG, "Poll save from ActivityStream data failed: " . $e->getMessage());
}
} else if ($responseElements->length) {
$data = $responseElements->item(0);
$selection = intval($data->getAttribute('selection'));
if (!$pollUri) {
- throw new Exception('Invalid poll response: no poll reference.');
+ // TRANS: Exception thrown trying to respond to a poll without a poll reference.
+ throw new Exception(_m('Invalid poll response: no poll reference.'));
}
$poll = Poll::staticGet('uri', $pollUri);
if (!$poll) {
- throw new Exception('Invalid poll response: poll is unknown.');
+ // TRANS: Exception thrown trying to respond to a non-existing poll.
+ throw new Exception(_m('Invalid poll response: poll is unknown.'));
}
try {
$notice = Poll_response::saveNew($profile, $poll, $selection, $options);
- common_log(LOG_DEBUG, "YYY response ok: " . $notice->id);
+ common_log(LOG_DEBUG, "Saved Poll_response ok, notice id: " . $notice->id);
return $notice;
} catch (Exception $e) {
- common_log(LOG_DEBUG, "YYY response fail: " . $e->getMessage());
+ common_log(LOG_DEBUG, "Poll response save fail: " . $e->getMessage());
}
} else {
common_log(LOG_DEBUG, "YYY no poll data");
case self::POLL_RESPONSE_OBJECT:
return $this->activityObjectFromNoticePollResponse($notice);
default:
- throw new Exception('Unexpected type for poll plugin: ' . $notice->object_type);
+ // TRANS: Exception thrown when performing an unexpected action on a poll.
+ // TRANS: %s is the unpexpected object type.
+ throw new Exception(sprintf(_m('Unexpected type for poll plugin: %s.'), $notice->object_type));
}
}
{
$object = new ActivityObject();
$object->id = $notice->uri;
- $object->type = self::POLL_OBJECT;
+ $object->type = self::POLL_RESPONSE_OBJECT;
$object->title = $notice->content;
$object->summary = $notice->content;
$object->link = $notice->bestUrl();
$response = Poll_response::getByNotice($notice);
- if (!$response) {
- common_log(LOG_DEBUG, "QQQ notice uri: $notice->uri");
- } else {
+ if ($response) {
$poll = $response->getPoll();
- /**
- * For the moment, using a kind of icky-looking schema that happens to
- * work with out code for generating both Atom and JSON forms, though
- * I don't like it:
- *
- * <poll:response xmlns:poll="http://apinamespace.org/activitystreams/object/poll"
- * poll="http://..../poll/...."
- * selection="3" />
- *
- * "poll:response": {
- * "xmlns:poll": http://apinamespace.org/activitystreams/object/poll
- * "uri": "http://..../poll/...."
- * "selection": 3
- * }
- *
- */
- // @fixme there's no way to specify an XML node tree here, like <poll><option/><option/></poll>
- // @fixme there's no way to specify a JSON array or multi-level tree unless you break the XML attribs
- // @fixme XML node contents don't get shown in JSON
- $data = array('xmlns:poll' => self::POLL_OBJECT,
- 'poll' => $poll->uri,
- 'selection' => intval($response->selection));
- $object->extra[] = array('poll:response', $data, '');
+ if ($poll) {
+ // Stash data to be formatted later by
+ // $this->activityObjectOutputAtom() or
+ // $this->activityObjectOutputJson()...
+ $object->pollSelection = intval($response->selection);
+ $object->pollUri = $poll->uri;
+ }
}
return $object;
}
{
$object = new ActivityObject();
$object->id = $notice->uri;
- $object->type = self::POLL_RESPONSE_OBJECT;
+ $object->type = self::POLL_OBJECT;
$object->title = $notice->content;
$object->summary = $notice->content;
$object->link = $notice->bestUrl();
$poll = Poll::getByNotice($notice);
- /**
- * Adding the poll-specific data. There's no standard in AS for polls,
- * so we're making stuff up.
- *
- * For the moment, using a kind of icky-looking schema that happens to
- * work with out code for generating both Atom and JSON forms, though
- * I don't like it:
- *
- * <poll:data xmlns:poll="http://apinamespace.org/activitystreams/object/poll"
- * question="Who wants a poll question?"
- * option1="Option one"
- * option2="Option two"
- * option3="Option three"></poll:data>
- *
- * "poll:response": {
- * "xmlns:poll": http://apinamespace.org/activitystreams/object/poll
- * "question": "Who wants a poll question?"
- * "option1": "Option one"
- * "option2": "Option two"
- * "option3": "Option three"
- * }
- *
- */
- // @fixme there's no way to specify an XML node tree here, like <poll><option/><option/></poll>
- // @fixme there's no way to specify a JSON array or multi-level tree unless you break the XML attribs
- // @fixme XML node contents don't get shown in JSON
- $data = array('xmlns:poll' => self::POLL_OBJECT,
- 'question' => $poll->question);
- foreach ($poll->getOptions() as $i => $opt) {
- $data['option' . ($i + 1)] = $opt;
+ if ($poll) {
+ // Stash data to be formatted later by
+ // $this->activityObjectOutputAtom() or
+ // $this->activityObjectOutputJson()...
+ $object->pollQuestion = $poll->question;
+ $object->pollOptions = $poll->getOptions();
}
- $object->extra[] = array('poll:poll', $data, '');
+
return $object;
}
+ /**
+ * Called when generating Atom XML ActivityStreams output from an
+ * ActivityObject belonging to this plugin. Gives the plugin
+ * a chance to add custom output.
+ *
+ * Note that you can only add output of additional XML elements,
+ * not change existing stuff here.
+ *
+ * If output is already handled by the base Activity classes,
+ * you can leave this base implementation as a no-op.
+ *
+ * @param ActivityObject $obj
+ * @param XMLOutputter $out to add elements at end of object
+ */
+ function activityObjectOutputAtom(ActivityObject $obj, XMLOutputter $out)
+ {
+ if (isset($obj->pollQuestion)) {
+ /**
+ * <poll:poll xmlns:poll="http://apinamespace.org/activitystreams/object/poll">
+ * <poll:question>Who wants a poll question?</poll:question>
+ * <poll:option>Option one</poll:option>
+ * <poll:option>Option two</poll:option>
+ * <poll:option>Option three</poll:option>
+ * </poll:poll>
+ */
+ $data = array('xmlns:poll' => self::POLL_OBJECT);
+ $out->elementStart('poll:poll', $data);
+ $out->element('poll:question', array(), $obj->pollQuestion);
+ foreach ($obj->pollOptions as $opt) {
+ $out->element('poll:option', array(), $opt);
+ }
+ $out->elementEnd('poll:poll');
+ }
+ if (isset($obj->pollSelection)) {
+ /**
+ * <poll:response xmlns:poll="http://apinamespace.org/activitystreams/object/poll">
+ * poll="http://..../poll/...."
+ * selection="3" />
+ */
+ $data = array('xmlns:poll' => self::POLL_OBJECT,
+ 'poll' => $obj->pollUri,
+ 'selection' => $obj->pollSelection);
+ $out->element('poll:response', $data, '');
+ }
+ }
+
+ /**
+ * Called when generating JSON ActivityStreams output from an
+ * ActivityObject belonging to this plugin. Gives the plugin
+ * a chance to add custom output.
+ *
+ * Modify the array contents to your heart's content, and it'll
+ * all get serialized out as JSON.
+ *
+ * If output is already handled by the base Activity classes,
+ * you can leave this base implementation as a no-op.
+ *
+ * @param ActivityObject $obj
+ * @param array &$out JSON-targeted array which can be modified
+ */
+ public function activityObjectOutputJson(ActivityObject $obj, array &$out)
+ {
+ common_log(LOG_DEBUG, 'QQQ: ' . var_export($obj, true));
+ if (isset($obj->pollQuestion)) {
+ /**
+ * "poll": {
+ * "question": "Who wants a poll question?",
+ * "options": [
+ * "Option 1",
+ * "Option 2",
+ * "Option 3"
+ * ]
+ * }
+ */
+ $data = array('question' => $obj->pollQuestion,
+ 'options' => array());
+ foreach ($obj->pollOptions as $opt) {
+ $data['options'][] = $opt;
+ }
+ $out['poll'] = $data;
+ }
+ if (isset($obj->pollSelection)) {
+ /**
+ * "pollResponse": {
+ * "poll": "http://..../poll/....",
+ * "selection": 3
+ * }
+ */
+ $data = array('poll' => $obj->pollUri,
+ 'selection' => $obj->pollSelection);
+ $out['pollResponse'] = $data;
+ }
+ }
+
+
/**
* @fixme WARNING WARNING WARNING parent class closes the final div that we
* open here, but we probably shouldn't open it here. Check parent class
case self::POLL_RESPONSE_OBJECT:
return $this->showNoticePollResponse($notice, $out);
default:
- throw new Exception('Unexpected type for poll plugin: ' . $notice->object_type);
+ // TRANS: Exception thrown when performing an unexpected action on a poll.
+ // TRANS: %s is the unpexpected object type.
+ throw new Exception(sprintf(_m('Unexpected type for poll plugin: %s.'), $notice->object_type));
}
}
$form->show();
}
} else {
- $out->text('Poll data is missing');
+ $out->text(_('Poll data is missing'));
}
$out->elementEnd('div');
function appTitle()
{
- return _m('Poll');
+ // TRANS: Application title.
+ return _m('APPTITLE','Poll');
}
}
*
* @see DB_DataObject
*/
-
class Poll_response extends Managed_DataObject
{
public $__table = 'poll_response'; // table name
* @return User_greeting_count object found, or null for no hits
*
*/
-
function staticGet($k, $v=null)
{
return Memcached_DataObject::staticGet('Poll_response', $k, $v);
* @return Bookmark object found, or null for no hits
*
*/
-
function pkeyGet($kv)
{
return Memcached_DataObject::pkeyGet('Poll_response', $kv);
*
* @return Poll_response found response or null
*/
-
function getByNotice($notice)
{
return self::staticGet('uri', $notice->uri);
*
* @return Notice saved notice
*/
-
static function saveNew($profile, $poll, $selection, $options=null)
{
if (empty($options)) {
}
if (!$poll->isValidSelection($selection)) {
+ // TRANS: Client exception thrown when responding to a poll with an invalid option.
throw new ClientException(_m('Invalid poll selection.'));
}
$opts = $poll->getOptions();
common_log(LOG_DEBUG, "Saving poll response: $pr->id $pr->uri");
$pr->insert();
+ // TRANS: Notice content voting for a poll.
+ // TRANS: %s is the chosen option in the poll.
$content = sprintf(_m('voted for "%s"'),
$answer);
- $rendered = sprintf(_m('voted for “<a href="%s">%s</a>”'),
- htmlspecialchars($poll->uri),
- htmlspecialchars($answer));
+ $link = '<a href="' . htmlspecialchars($poll->uri) . '">' . htmlspecialchars($answer) . '</a>';
+ // TRANS: Rendered version of the notice content voting for a poll.
+ // TRANS: %s a link to the poll with the chosen option as link description.
+ $rendered = sprintf(_m('voted for "%s"'), $link);
$tags = array();
$replies = array();
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. TRANS: Client exception thrown trying to view a non-existing poll.
+#: showpoll.php:68
+msgid "No such poll."
+msgstr ""
+
+#. TRANS: Client exception thrown trying to view a non-existing poll notice.
+#: showpoll.php:76
+msgid "No such poll notice."
+msgstr ""
+
+#. TRANS: Client exception thrown trying to view a poll of a non-existing user.
+#: showpoll.php:83
+msgid "No such user."
+msgstr ""
+
+#. TRANS: Server exception thrown trying to view a poll for a user for which the profile could not be loaded.
+#: showpoll.php:90
+msgid "User without a profile."
+msgstr ""
+
+#. TRANS: Page title for a poll.
+#. TRANS: %1$s is the nickname of the user that created the poll, %2$s is the poll question.
+#: showpoll.php:109
+#, php-format
+msgid "%1$s's poll: %2$s"
+msgstr ""
+
+#. TRANS: Field label on the page to create a poll.
+#: newpollform.php:107
+msgid "Question"
+msgstr ""
+
+#. TRANS: Field title on the page to create a poll.
+#: newpollform.php:110
+msgid "What question are people answering?"
+msgstr ""
+
+#. TRANS: Field label for an answer option on the page to create a poll.
+#. TRANS: %d is the option number.
+#: newpollform.php:128
+#, php-format
+msgid "Option %d"
+msgstr ""
+
+#. TRANS: Button text for saving a new poll.
+#: newpollform.php:145
+msgctxt "BUTTON"
+msgid "Save"
+msgstr ""
+
+#. TRANS: Plugin description.
+#: PollPlugin.php:157
+msgid "Simple extension for supporting basic polls."
+msgstr ""
+
+#. TRANS: Exception thrown trying to respond to a poll without a poll reference.
+#: PollPlugin.php:230
+msgid "Invalid poll response: no poll reference."
+msgstr ""
+
+#. TRANS: Exception thrown trying to respond to a non-existing poll.
+#: PollPlugin.php:235
+msgid "Invalid poll response: poll is unknown."
+msgstr ""
+
+#. TRANS: Exception thrown when performing an unexpected action on a poll.
+#. TRANS: %s is the unpexpected object type.
+#: PollPlugin.php:262 PollPlugin.php:420
+#, php-format
+msgid "Unexpected type for poll plugin: %s."
+msgstr ""
+
+#. TRANS: Application title.
+#: PollPlugin.php:481
+msgctxt "APPTITLE"
+msgid "Poll"
+msgstr ""
+
+#. TRANS: Client exception thrown when responding to a poll with an invalid option.
+#. TRANS: Client exception thrown responding to a poll with an invalid answer.
+#: Poll_response.php:166 respondpoll.php:102
+msgid "Invalid poll selection."
+msgstr ""
+
+#. TRANS: Notice content voting for a poll.
+#. TRANS: %s is the chosen option in the poll.
+#. TRANS: Rendered version of the notice content voting for a poll.
+#. TRANS: %s a link to the poll with the chosen option as link description.
+#: Poll_response.php:195 Poll_response.php:200
+#, php-format
+msgid "voted for \"%s\""
+msgstr ""
+
+#. TRANS: Button text for submitting a poll response.
+#: pollresponseform.php:127
+msgctxt "BUTTON"
+msgid "Submit"
+msgstr ""
+
+#. TRANS: Notice content creating a poll.
+#. TRANS: %1$s is the poll question, %2$s is a link to the poll.
+#: Poll.php:240
+#, php-format
+msgid "Poll: %1$s %2$s"
+msgstr ""
+
+#. TRANS: Rendered version of the notice content creating a poll.
+#. TRANS: %s a link to the poll with the question as link description.
+#: Poll.php:246
+#, php-format
+msgid "Poll: %s"
+msgstr ""
+
+#. TRANS: Title for poll page.
+#: newpoll.php:63
+msgid "New poll"
+msgstr ""
+
+#. TRANS: Client exception thrown trying to create a poll while not logged in.
+#: newpoll.php:81
+msgid "You must be logged in to post a poll."
+msgstr ""
+
+#. TRANS: Client exception thrown trying to create a poll without a question.
+#: newpoll.php:133
+msgid "Poll must have a question."
+msgstr ""
+
+#. TRANS: Client exception thrown trying to create a poll with fewer than two options.
+#: newpoll.php:138
+msgid "Poll must have at least two options."
+msgstr ""
+
+#. TRANS: Page title after sending a notice.
+#: newpoll.php:157
+msgid "Notice posted"
+msgstr ""
+
+#. TRANS: Page title for poll response.
+#: respondpoll.php:63
+msgid "Poll response"
+msgstr ""
+
+#. TRANS: Client exception thrown trying to respond to a poll while not logged in.
+#: respondpoll.php:84
+msgid "You must be logged in to respond to a poll."
+msgstr ""
+
+#. TRANS: Client exception thrown trying to respond to a non-existing poll.
+#: respondpoll.php:96
+msgid "Invalid or missing poll."
+msgstr ""
+
+#. TRANS: Page title after sending a poll response.
+#: respondpoll.php:152
+msgid "Poll results"
+msgstr ""
--- /dev/null
+# Translation of StatusNet - Poll to Interlingua (Interlingua)
+# Exported from translatewiki.net
+#
+# Author: McDutchie
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Poll\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:51:40+0000\n"
+"Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:58:12+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: ia\n"
+"X-Message-Group: #out-statusnet-plugin-poll\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. TRANS: Client exception thrown trying to view a non-existing poll.
+msgid "No such poll."
+msgstr "Iste sondage non existe."
+
+#. TRANS: Client exception thrown trying to view a non-existing poll notice.
+msgid "No such poll notice."
+msgstr "Iste nota de sondage non existe."
+
+#. TRANS: Client exception thrown trying to view a poll of a non-existing user.
+msgid "No such user."
+msgstr "Iste usator non existe."
+
+#. TRANS: Server exception thrown trying to view a poll for a user for which the profile could not be loaded.
+msgid "User without a profile."
+msgstr "Usator sin profilo."
+
+#. TRANS: Page title for a poll.
+#. TRANS: %1$s is the nickname of the user that created the poll, %2$s is the poll question.
+#, php-format
+msgid "%1$s's poll: %2$s"
+msgstr "Le sondage de %1$s: %2$s"
+
+#. TRANS: Field label on the page to create a poll.
+msgid "Question"
+msgstr "Question"
+
+#. TRANS: Field title on the page to create a poll.
+msgid "What question are people answering?"
+msgstr "A qual question responde le gente?"
+
+#. TRANS: Field label for an answer option on the page to create a poll.
+#. TRANS: %d is the option number.
+#, php-format
+msgid "Option %d"
+msgstr "Option %d"
+
+#. TRANS: Button text for saving a new poll.
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Salveguardar"
+
+#. TRANS: Plugin description.
+msgid "Simple extension for supporting basic polls."
+msgstr "Extension simple pro supportar sondages basic."
+
+#. TRANS: Exception thrown trying to respond to a poll without a poll reference.
+msgid "Invalid poll response: no poll reference."
+msgstr "Responsa invalide a sondage: sin referentia a un sondage."
+
+#. TRANS: Exception thrown trying to respond to a non-existing poll.
+msgid "Invalid poll response: poll is unknown."
+msgstr "Responsa invalide a sondage: le sondage es incognite."
+
+#. TRANS: Exception thrown when performing an unexpected action on a poll.
+#. TRANS: %s is the unpexpected object type.
+#, php-format
+msgid "Unexpected type for poll plugin: %s."
+msgstr "Typo inexpectate pro le plug-in de sondages: %s."
+
+#. TRANS: Application title.
+msgctxt "APPTITLE"
+msgid "Poll"
+msgstr "Sondage"
+
+#. TRANS: Client exception thrown when responding to a poll with an invalid option.
+#. TRANS: Client exception thrown responding to a poll with an invalid answer.
+msgid "Invalid poll selection."
+msgstr "Selection de sondage invalide."
+
+#. TRANS: Notice content voting for a poll.
+#. TRANS: %s is the chosen option in the poll.
+#. TRANS: Rendered version of the notice content voting for a poll.
+#. TRANS: %s a link to the poll with the chosen option as link description.
+#, php-format
+msgid "voted for \"%s\""
+msgstr "votava pro \"%s\""
+
+#. TRANS: Button text for submitting a poll response.
+msgctxt "BUTTON"
+msgid "Submit"
+msgstr "Submitter"
+
+#. TRANS: Notice content creating a poll.
+#. TRANS: %1$s is the poll question, %2$s is a link to the poll.
+#, php-format
+msgid "Poll: %1$s %2$s"
+msgstr "Sondage: %1$s %2$s"
+
+#. TRANS: Rendered version of the notice content creating a poll.
+#. TRANS: %s a link to the poll with the question as link description.
+#, php-format
+msgid "Poll: %s"
+msgstr "Sondage: %s"
+
+#. TRANS: Title for poll page.
+msgid "New poll"
+msgstr "Nove sondage"
+
+#. TRANS: Client exception thrown trying to create a poll while not logged in.
+msgid "You must be logged in to post a poll."
+msgstr "Tu debe aperir un session pro publicar un sondage."
+
+#. TRANS: Client exception thrown trying to create a poll without a question.
+msgid "Poll must have a question."
+msgstr "Le sondage debe haber un question."
+
+#. TRANS: Client exception thrown trying to create a poll with fewer than two options.
+msgid "Poll must have at least two options."
+msgstr "Le sondage debe haber al minus duo optiones."
+
+#. TRANS: Page title after sending a notice.
+msgid "Notice posted"
+msgstr "Nota publicate"
+
+#. TRANS: Page title for poll response.
+msgid "Poll response"
+msgstr "Responsa al sondage"
+
+#. TRANS: Client exception thrown trying to respond to a poll while not logged in.
+msgid "You must be logged in to respond to a poll."
+msgstr "Tu debe aperir un session pro responder a un sondage."
+
+#. TRANS: Client exception thrown trying to respond to a non-existing poll.
+msgid "Invalid or missing poll."
+msgstr "Sondage invalide o mancante."
+
+#. TRANS: Page title after sending a poll response.
+msgid "Poll results"
+msgstr "Resultatos del sondage"
--- /dev/null
+# Translation of StatusNet - Poll to Macedonian (Македонски)
+# Exported from translatewiki.net
+#
+# Author: Bjankuloski06
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Poll\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:51:41+0000\n"
+"Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:58:12+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: mk\n"
+"X-Message-Group: #out-statusnet-plugin-poll\n"
+"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"
+
+#. TRANS: Client exception thrown trying to view a non-existing poll.
+msgid "No such poll."
+msgstr "Нема таква анкета."
+
+#. TRANS: Client exception thrown trying to view a non-existing poll notice.
+msgid "No such poll notice."
+msgstr "Нема таква анкетна забелешка."
+
+#. TRANS: Client exception thrown trying to view a poll of a non-existing user.
+msgid "No such user."
+msgstr "Нема таков корисник."
+
+#. TRANS: Server exception thrown trying to view a poll for a user for which the profile could not be loaded.
+msgid "User without a profile."
+msgstr "Корисник без профил."
+
+#. TRANS: Page title for a poll.
+#. TRANS: %1$s is the nickname of the user that created the poll, %2$s is the poll question.
+#, php-format
+msgid "%1$s's poll: %2$s"
+msgstr "Анкета на %1$s: %2$s"
+
+#. TRANS: Field label on the page to create a poll.
+msgid "Question"
+msgstr "Прашање"
+
+#. TRANS: Field title on the page to create a poll.
+msgid "What question are people answering?"
+msgstr "На кое прашање одговараат луѓето?"
+
+#. TRANS: Field label for an answer option on the page to create a poll.
+#. TRANS: %d is the option number.
+#, php-format
+msgid "Option %d"
+msgstr "Можност %d"
+
+#. TRANS: Button text for saving a new poll.
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Зачувај"
+
+#. TRANS: Plugin description.
+msgid "Simple extension for supporting basic polls."
+msgstr "Прост додаток за поддршка на едноставни анкети."
+
+#. TRANS: Exception thrown trying to respond to a poll without a poll reference.
+msgid "Invalid poll response: no poll reference."
+msgstr "Неважечки одговор во анкетата: нема назнака на анкетата."
+
+#. TRANS: Exception thrown trying to respond to a non-existing poll.
+msgid "Invalid poll response: poll is unknown."
+msgstr "Неважечки одговор во анкетата: анкетата е непозната."
+
+#. TRANS: Exception thrown when performing an unexpected action on a poll.
+#. TRANS: %s is the unpexpected object type.
+#, php-format
+msgid "Unexpected type for poll plugin: %s."
+msgstr "Неочекуван тип за анкетен приклучок: %s."
+
+#. TRANS: Application title.
+msgctxt "APPTITLE"
+msgid "Poll"
+msgstr "Анкета"
+
+#. TRANS: Client exception thrown when responding to a poll with an invalid option.
+#. TRANS: Client exception thrown responding to a poll with an invalid answer.
+msgid "Invalid poll selection."
+msgstr "Неважечки избор на анкета."
+
+#. TRANS: Notice content voting for a poll.
+#. TRANS: %s is the chosen option in the poll.
+#. TRANS: Rendered version of the notice content voting for a poll.
+#. TRANS: %s a link to the poll with the chosen option as link description.
+#, php-format
+msgid "voted for \"%s\""
+msgstr "гласаше за „%s“"
+
+#. TRANS: Button text for submitting a poll response.
+msgctxt "BUTTON"
+msgid "Submit"
+msgstr "Поднеси"
+
+#. TRANS: Notice content creating a poll.
+#. TRANS: %1$s is the poll question, %2$s is a link to the poll.
+#, php-format
+msgid "Poll: %1$s %2$s"
+msgstr "Анкета: %1$s %2$s"
+
+#. TRANS: Rendered version of the notice content creating a poll.
+#. TRANS: %s a link to the poll with the question as link description.
+#, php-format
+msgid "Poll: %s"
+msgstr "Анкета: %s"
+
+#. TRANS: Title for poll page.
+msgid "New poll"
+msgstr "Нова анкета"
+
+#. TRANS: Client exception thrown trying to create a poll while not logged in.
+msgid "You must be logged in to post a poll."
+msgstr "Мора да сте најавени за да можете да објавите анкета."
+
+#. TRANS: Client exception thrown trying to create a poll without a question.
+msgid "Poll must have a question."
+msgstr "Анкетата мора да има прашање."
+
+#. TRANS: Client exception thrown trying to create a poll with fewer than two options.
+msgid "Poll must have at least two options."
+msgstr "Анкетата мора да има барем две можности."
+
+#. TRANS: Page title after sending a notice.
+msgid "Notice posted"
+msgstr "Забелешката е објавена"
+
+#. TRANS: Page title for poll response.
+msgid "Poll response"
+msgstr "Одговор на анкетата"
+
+#. TRANS: Client exception thrown trying to respond to a poll while not logged in.
+msgid "You must be logged in to respond to a poll."
+msgstr "Мора да сте најавени за да можете да одговарате на анкети."
+
+#. TRANS: Client exception thrown trying to respond to a non-existing poll.
+msgid "Invalid or missing poll."
+msgstr "Неважечка или непостоечка анкета."
+
+#. TRANS: Page title after sending a poll response.
+msgid "Poll results"
+msgstr "Резултати од анкетата"
--- /dev/null
+# Translation of StatusNet - Poll to Dutch (Nederlands)
+# Exported from translatewiki.net
+#
+# Author: Siebrand
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Poll\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:51:41+0000\n"
+"Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:58:12+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: nl\n"
+"X-Message-Group: #out-statusnet-plugin-poll\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. TRANS: Client exception thrown trying to view a non-existing poll.
+msgid "No such poll."
+msgstr "Deze peiling bestaat niet."
+
+#. TRANS: Client exception thrown trying to view a non-existing poll notice.
+msgid "No such poll notice."
+msgstr "Dit peilingsbericht bestaat niet."
+
+#. TRANS: Client exception thrown trying to view a poll of a non-existing user.
+msgid "No such user."
+msgstr "Deze gebruiker bestaat niet."
+
+#. TRANS: Server exception thrown trying to view a poll for a user for which the profile could not be loaded.
+msgid "User without a profile."
+msgstr "Gebruiker zonder een profiel."
+
+#. TRANS: Page title for a poll.
+#. TRANS: %1$s is the nickname of the user that created the poll, %2$s is the poll question.
+#, php-format
+msgid "%1$s's poll: %2$s"
+msgstr "Peiling van %1$s: %2$s"
+
+#. TRANS: Field label on the page to create a poll.
+msgid "Question"
+msgstr "Vraag"
+
+#. TRANS: Field title on the page to create a poll.
+msgid "What question are people answering?"
+msgstr "Welke vraag beantwoorden de mensen?"
+
+#. TRANS: Field label for an answer option on the page to create a poll.
+#. TRANS: %d is the option number.
+#, php-format
+msgid "Option %d"
+msgstr "Keuze %d"
+
+#. TRANS: Button text for saving a new poll.
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Opslaan"
+
+#. TRANS: Plugin description.
+msgid "Simple extension for supporting basic polls."
+msgstr "Eenvoudige plug-in voor peilingen."
+
+#. TRANS: Exception thrown trying to respond to a poll without a poll reference.
+msgid "Invalid poll response: no poll reference."
+msgstr "Ongeldig antwoord op peiling: heeft geen verwijzing naar een peiling."
+
+#. TRANS: Exception thrown trying to respond to a non-existing poll.
+msgid "Invalid poll response: poll is unknown."
+msgstr "Ongeldig antwoord op peiling: de peiling bestaat niet."
+
+#. TRANS: Exception thrown when performing an unexpected action on a poll.
+#. TRANS: %s is the unpexpected object type.
+#, php-format
+msgid "Unexpected type for poll plugin: %s."
+msgstr "Onverwacht type voor peilingplug-in: %s"
+
+#. TRANS: Application title.
+msgctxt "APPTITLE"
+msgid "Poll"
+msgstr "Peiling"
+
+#. TRANS: Client exception thrown when responding to a poll with an invalid option.
+#. TRANS: Client exception thrown responding to a poll with an invalid answer.
+msgid "Invalid poll selection."
+msgstr "Ongeldige keuze voor peiling."
+
+#. TRANS: Notice content voting for a poll.
+#. TRANS: %s is the chosen option in the poll.
+#. TRANS: Rendered version of the notice content voting for a poll.
+#. TRANS: %s a link to the poll with the chosen option as link description.
+#, php-format
+msgid "voted for \"%s\""
+msgstr "gestemd voor \"%s\""
+
+#. TRANS: Button text for submitting a poll response.
+msgctxt "BUTTON"
+msgid "Submit"
+msgstr "Opslaan"
+
+#. TRANS: Notice content creating a poll.
+#. TRANS: %1$s is the poll question, %2$s is a link to the poll.
+#, php-format
+msgid "Poll: %1$s %2$s"
+msgstr "Peiling: %1$s %2$s"
+
+#. TRANS: Rendered version of the notice content creating a poll.
+#. TRANS: %s a link to the poll with the question as link description.
+#, php-format
+msgid "Poll: %s"
+msgstr "Peiling: %s"
+
+#. TRANS: Title for poll page.
+msgid "New poll"
+msgstr "Nieuwe peiling"
+
+#. TRANS: Client exception thrown trying to create a poll while not logged in.
+msgid "You must be logged in to post a poll."
+msgstr "U moet aangemeld zijn om een peiling aan te kunnen maken."
+
+#. TRANS: Client exception thrown trying to create a poll without a question.
+msgid "Poll must have a question."
+msgstr "De peiling moet een vraag hebben."
+
+#. TRANS: Client exception thrown trying to create a poll with fewer than two options.
+msgid "Poll must have at least two options."
+msgstr "De peiling moet tenminste twee antwoordmogelijkheden hebben."
+
+#. TRANS: Page title after sending a notice.
+msgid "Notice posted"
+msgstr "De mededeling is verzonden"
+
+#. TRANS: Page title for poll response.
+msgid "Poll response"
+msgstr "Peilingreactie"
+
+#. TRANS: Client exception thrown trying to respond to a poll while not logged in.
+msgid "You must be logged in to respond to a poll."
+msgstr "U moet aangemeld zijn om te kunnen stemmen in een peiling."
+
+#. TRANS: Client exception thrown trying to respond to a non-existing poll.
+msgid "Invalid or missing poll."
+msgstr "De peiling is ongeldig of bestaat niet."
+
+#. TRANS: Page title after sending a poll response.
+msgid "Poll results"
+msgstr "Peilingresultaten"
--- /dev/null
+# Translation of StatusNet - Poll to Ukrainian (Українська)
+# Exported from translatewiki.net
+#
+# Author: Boogie
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Poll\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:51:41+0000\n"
+"Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-11 18:58:12+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: uk\n"
+"X-Message-Group: #out-statusnet-plugin-poll\n"
+"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
+"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"
+
+#. TRANS: Client exception thrown trying to view a non-existing poll.
+msgid "No such poll."
+msgstr "Немає такого опитування."
+
+#. TRANS: Client exception thrown trying to view a non-existing poll notice.
+msgid "No such poll notice."
+msgstr "Немає допису щодо опитування."
+
+#. TRANS: Client exception thrown trying to view a poll of a non-existing user.
+msgid "No such user."
+msgstr "Такого користувача немає."
+
+#. TRANS: Server exception thrown trying to view a poll for a user for which the profile could not be loaded.
+msgid "User without a profile."
+msgstr "Користувач без профілю."
+
+#. TRANS: Page title for a poll.
+#. TRANS: %1$s is the nickname of the user that created the poll, %2$s is the poll question.
+#, php-format
+msgid "%1$s's poll: %2$s"
+msgstr "Опитування %1$s: %2$s"
+
+#. TRANS: Field label on the page to create a poll.
+msgid "Question"
+msgstr "Питання"
+
+#. TRANS: Field title on the page to create a poll.
+msgid "What question are people answering?"
+msgstr "На яке запитання відповідати людям?"
+
+#. TRANS: Field label for an answer option on the page to create a poll.
+#. TRANS: %d is the option number.
+#, php-format
+msgid "Option %d"
+msgstr "Варіант %d"
+
+#. TRANS: Button text for saving a new poll.
+msgctxt "BUTTON"
+msgid "Save"
+msgstr "Зберегти"
+
+#. TRANS: Plugin description.
+msgid "Simple extension for supporting basic polls."
+msgstr "Простий додаток для підтримки проведення опитувань."
+
+#. TRANS: Exception thrown trying to respond to a poll without a poll reference.
+msgid "Invalid poll response: no poll reference."
+msgstr "Невірна відповідь: відсутнє посилання на опитування."
+
+#. TRANS: Exception thrown trying to respond to a non-existing poll.
+msgid "Invalid poll response: poll is unknown."
+msgstr "Неправильна відповідь на опитування: невідоме опитування."
+
+#. TRANS: Exception thrown when performing an unexpected action on a poll.
+#. TRANS: %s is the unpexpected object type.
+#, php-format
+msgid "Unexpected type for poll plugin: %s."
+msgstr "Неочікувана дія для додатку опитувань: %s."
+
+#. TRANS: Application title.
+msgctxt "APPTITLE"
+msgid "Poll"
+msgstr "Опитування"
+
+#. TRANS: Client exception thrown when responding to a poll with an invalid option.
+#. TRANS: Client exception thrown responding to a poll with an invalid answer.
+msgid "Invalid poll selection."
+msgstr "Невірний вибір опитування."
+
+#. TRANS: Notice content voting for a poll.
+#. TRANS: %s is the chosen option in the poll.
+#. TRANS: Rendered version of the notice content voting for a poll.
+#. TRANS: %s a link to the poll with the chosen option as link description.
+#, php-format
+msgid "voted for \"%s\""
+msgstr "проголосувало за «%s»"
+
+#. TRANS: Button text for submitting a poll response.
+msgctxt "BUTTON"
+msgid "Submit"
+msgstr "Надіслати"
+
+#. TRANS: Notice content creating a poll.
+#. TRANS: %1$s is the poll question, %2$s is a link to the poll.
+#, php-format
+msgid "Poll: %1$s %2$s"
+msgstr "Опитування: %1$s %2$s"
+
+#. TRANS: Rendered version of the notice content creating a poll.
+#. TRANS: %s a link to the poll with the question as link description.
+#, php-format
+msgid "Poll: %s"
+msgstr "Опитування: %s"
+
+#. TRANS: Title for poll page.
+msgid "New poll"
+msgstr "Нове опитування"
+
+#. TRANS: Client exception thrown trying to create a poll while not logged in.
+msgid "You must be logged in to post a poll."
+msgstr "Ви повинні увійти до системи, щоб взяти участь в опитуванні."
+
+#. TRANS: Client exception thrown trying to create a poll without a question.
+msgid "Poll must have a question."
+msgstr "Опитування повинно мати запитання."
+
+#. TRANS: Client exception thrown trying to create a poll with fewer than two options.
+msgid "Poll must have at least two options."
+msgstr "Опитування повинно мати принаймні два варіанти."
+
+#. TRANS: Page title after sending a notice.
+msgid "Notice posted"
+msgstr "Допис опубліковано"
+
+#. TRANS: Page title for poll response.
+msgid "Poll response"
+msgstr "Відповіді на опитування"
+
+#. TRANS: Client exception thrown trying to respond to a poll while not logged in.
+msgid "You must be logged in to respond to a poll."
+msgstr "Ви повинні увійти до системи, щоб відповісти на опитування."
+
+#. TRANS: Client exception thrown trying to respond to a non-existing poll.
+msgid "Invalid or missing poll."
+msgstr "Невірне або відсутнє опитування."
+
+#. TRANS: Page title after sending a poll response.
+msgid "Poll results"
+msgstr "Результати опитування"
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
-
class NewPollAction extends Action
{
protected $user = null;
*
* @return string Action title
*/
-
function title()
{
- return _('New poll');
+ // TRANS: Title for poll page.
+ return _m('New poll');
}
/**
*
* @return boolean true
*/
-
function prepare($argarray)
{
parent::prepare($argarray);
$this->user = common_current_user();
if (empty($this->user)) {
- throw new ClientException(_("Must be logged in to post a poll."),
+ // TRANS: Client exception thrown trying to create a poll while not logged in.
+ throw new ClientException(_m('You must be logged in to post a poll.'),
403);
}
*
* @return void
*/
-
function handle($argarray=null)
{
parent::handle($argarray);
*
* @return void
*/
-
function newPoll()
{
if ($this->boolean('ajax')) {
}
try {
if (empty($this->question)) {
- throw new ClientException(_('Poll must have a question.'));
+ // TRANS: Client exception thrown trying to create a poll without a question.
+ throw new ClientException(_m('Poll must have a question.'));
}
if (count($this->options) < 2) {
- throw new ClientException(_('Poll must have at least two options.'));
+ // TRANS: Client exception thrown trying to create a poll with fewer than two options.
+ throw new ClientException(_m('Poll must have at least two options.'));
}
$saved = Poll::saveNew($this->user->getProfile(),
$this->question,
$this->options);
-
} catch (ClientException $ce) {
$this->error = $ce->getMessage();
$this->showPage();
$this->elementStart('html');
$this->elementStart('head');
// TRANS: Page title after sending a notice.
- $this->element('title', null, _('Notice posted'));
+ $this->element('title', null, _m('Notice posted'));
$this->elementEnd('head');
$this->elementStart('body');
$this->showNotice($saved);
*
* @return void
*/
-
function showContent()
{
if (!empty($this->error)) {
*
* @return boolean is read only action?
*/
-
function isReadOnly($args)
{
if ($_SERVER['REQUEST_METHOD'] == 'GET' ||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
-
class NewpollForm extends Form
{
-
protected $question = null;
protected $options = array();
*
* @return void
*/
-
function __construct($out=null, $question=null, $options=null)
{
parent::__construct($out);
*
* @return int ID of the form
*/
-
function id()
{
return 'newpoll-form';
*
* @return string class of the form
*/
-
function formClass()
{
return 'form_settings ajax-notice';
*
* @return string URL of the action
*/
-
function action()
{
return common_local_url('newpoll');
*
* @return void
*/
-
function formData()
{
$this->out->elementStart('fieldset', array('id' => 'newpoll-data'));
$this->li();
$this->out->input('question',
+ // TRANS: Field label on the page to create a poll.
_m('Question'),
$this->question,
+ // TRANS: Field title on the page to create a poll.
_m('What question are people answering?'));
$this->unli();
}
$this->li();
$this->out->input('option' . ($i + 1),
+ // TRANS: Field label for an answer option on the page to create a poll.
+ // TRANS: %d is the option number.
sprintf(_m('Option %d'), $i + 1),
$default);
$this->unli();
*
* @return void
*/
-
function formActions()
{
+ // TRANS: Button text for saving a new poll.
$this->out->submit('submit', _m('BUTTON', 'Save'));
}
}
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
-
class PollResponseForm extends Form
{
protected $poll;
*
* @return void
*/
-
function __construct(Poll $poll, HTMLOutputter $out)
{
parent::__construct($out);
*
* @return int ID of the form
*/
-
function id()
{
return 'pollresponse-form';
*
* @return string class of the form
*/
-
function formClass()
{
return 'form_settings ajax';
*
* @return string URL of the action
*/
-
function action()
{
return common_local_url('respondpoll', array('id' => $this->poll->id));
*
* @return void
*/
-
function formData()
{
$poll = $this->poll;
*
* @return void
*/
-
function formActions()
{
+ // TRANS: Button text for submitting a poll response.
$this->out->submit('submit', _m('BUTTON', 'Submit'));
}
}
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
-
class PollResultForm extends Form
{
protected $poll;
*
* @return void
*/
-
function __construct(Poll $poll, HTMLOutputter $out)
{
parent::__construct($out);
*
* @return int ID of the form
*/
-
function id()
{
return 'pollresult-form';
*
* @return string class of the form
*/
-
function formClass()
{
return 'form_settings ajax';
*
* @return string URL of the action
*/
-
function action()
{
return common_local_url('respondpoll', array('id' => $this->poll->id));
*
* @return void
*/
-
function formData()
{
$poll = $this->poll;
*
* @return void
*/
-
function formActions()
{
}
* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2011, StatusNet, Inc.
*
- * Add a new Poll
+ * Respond to a Poll
*
* PHP version 5
*
}
/**
- * Add a new Poll
+ * Respond to a Poll
*
* @category Poll
* @package StatusNet
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
-
class RespondPollAction extends Action
{
protected $user = null;
*
* @return string Action title
*/
-
function title()
{
+ // TRANS: Page title for poll response.
return _m('Poll response');
}
*
* @return boolean true
*/
-
function prepare($argarray)
{
parent::prepare($argarray);
$this->user = common_current_user();
if (empty($this->user)) {
- throw new ClientException(_m("Must be logged in to respond to a poll."),
+ // TRANS: Client exception thrown trying to respond to a poll while not logged in.
+ throw new ClientException(_m("You must be logged in to respond to a poll."),
403);
}
$id = $this->trimmed('id');
$this->poll = Poll::staticGet('id', $id);
if (empty($this->poll)) {
- throw new ClientException(_m("Invalid or missing poll."), 404);
+ // TRANS: Client exception thrown trying to respond to a non-existing poll.
+ throw new ClientException(_m('Invalid or missing poll.'), 404);
}
$selection = intval($this->trimmed('pollselection'));
if ($selection < 1 || $selection > count($this->poll->getOptions())) {
+ // TRANS: Client exception thrown responding to a poll with an invalid answer.
throw new ClientException(_m('Invalid poll selection.'));
}
$this->selection = $selection;
*
* @return void
*/
-
function handle($argarray=null)
{
parent::handle($argarray);
*
* @return void
*/
-
function respondPoll()
{
try {
*
* @return void
*/
-
function showContent()
{
if (!empty($this->error)) {
*
* @return boolean is read only action?
*/
-
function isReadOnly($args)
{
if ($_SERVER['REQUEST_METHOD'] == 'GET' ||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
-
class ShowPollAction extends ShownoticeAction
{
protected $poll = null;
*
* @return boolean true
*/
-
function prepare($argarray)
{
OwnerDesignAction::prepare($argarray);
$this->poll = Poll::staticGet('id', $this->id);
if (empty($this->poll)) {
+ // TRANS: Client exception thrown trying to view a non-existing poll.
throw new ClientException(_m('No such poll.'), 404);
}
if (empty($this->notice)) {
// Did we used to have it, and it got deleted?
+ // TRANS: Client exception thrown trying to view a non-existing poll notice.
throw new ClientException(_m('No such poll notice.'), 404);
}
$this->user = User::staticGet('id', $this->poll->profile_id);
if (empty($this->user)) {
+ // TRANS: Client exception thrown trying to view a poll of a non-existing user.
throw new ClientException(_m('No such user.'), 404);
}
$this->profile = $this->user->getProfile();
if (empty($this->profile)) {
+ // TRANS: Server exception thrown trying to view a poll for a user for which the profile could not be loaded.
throw new ServerException(_m('User without a profile.'));
}
*
* @return string page tile
*/
-
function title()
{
- return sprintf(_('%s\'s poll: %s'),
+ // TRANS: Page title for a poll.
+ // TRANS: %1$s is the nickname of the user that created the poll, %2$s is the poll question.
+ return sprintf(_m('%1$s\'s poll: %2$s'),
$this->user->nickname,
$this->poll->question);
}
{
return Action::etag();
}
-
}
+As of StatusNet 1.0.x, actual formatting of the notices is done server-side,
+loaded by AJAX after the real-time notification comes in. This has the drawback
+that we may make extra HTTP requests and delay incoming notices a little, but
+means that formatting and internationalization is consistent.
+
== TODO ==
-* i18n
* Update mark behaviour (on notice send)
* Pause, Send a notice ~ should not update counter
* Pause ~ retain up to 50-100 most recent notices
-* Add geo data
* Make it work for Conversation page (perhaps a little tricky)
* IE is updating the counter in document title all the time (Not sure if this
is still an issue)
*/
class RealtimePlugin extends Plugin
{
- protected $replyurl = null;
- protected $favorurl = null;
- protected $deleteurl = null;
+ protected $showurl = null;
/**
* When it's time to initialize the plugin, calculate and
function onInitializePlugin()
{
- $this->replyurl = common_local_url('newnotice');
- $this->favorurl = common_local_url('favor');
- $this->repeaturl = common_local_url('repeat');
// FIXME: need to find a better way to pass this pattern in
- $this->deleteurl = common_local_url('deletenotice',
+ $this->showurl = common_local_url('shownotice',
array('notice' => '0000000000'));
return true;
}
function _getScripts()
{
- return array(Plugin::staticPath('Realtime', 'realtimeupdate.min.js'));
+ if (common_config('site', 'minify')) {
+ $js = 'realtimeupdate.min.js';
+ } else {
+ $js = 'realtimeupdate.js';
+ }
+ return array(Plugin::staticPath('Realtime', $js));
}
/**
function _updateInitialize($timeline, $user_id)
{
- return "RealtimeUpdate.init($user_id, \"$this->replyurl\", \"$this->favorurl\", \"$this->repeaturl\", \"$this->deleteurl\"); ";
+ return "RealtimeUpdate.init($user_id, \"$this->showurl\"); ";
}
function _connect()
*/
RealtimeUpdate = {
_userid: 0,
- _replyurl: '',
- _favorurl: '',
- _repeaturl: '',
- _deleteurl: '',
+ _showurl: '',
_updatecounter: 0,
_maxnotices: 50,
_windowhasfocus: true,
* feed data into the RealtimeUpdate object!
*
* @param {int} userid: local profile ID of the currently logged-in user
- * @param {String} replyurl: URL for newnotice action, used when generating reply buttons
- * @param {String} favorurl: URL for favor action, used when generating fave buttons
- * @param {String} repeaturl: URL for repeat action, used when generating repeat buttons
- * @param {String} deleteurl: URL template for deletenotice action, used when generating delete buttons.
+ * @param {String} showurl: URL for shownotice action, used when fetching formatting notices.
* This URL contains a stub value of 0000000000 which will be replaced with the notice ID.
*
* @access public
*/
- init: function(userid, replyurl, favorurl, repeaturl, deleteurl)
+ init: function(userid, showurl)
{
RealtimeUpdate._userid = userid;
- RealtimeUpdate._replyurl = replyurl;
- RealtimeUpdate._favorurl = favorurl;
- RealtimeUpdate._repeaturl = repeaturl;
- RealtimeUpdate._deleteurl = deleteurl;
+ RealtimeUpdate._showurl = showurl;
RealtimeUpdate._documenttitle = document.title;
return;
}
- var noticeItem = RealtimeUpdate.makeNoticeItem(data);
- var noticeItemID = $(noticeItem).attr('id');
-
- var list = $("#notices_primary .notices:first")
- var prepend = true;
-
- var threaded = list.hasClass('threaded-notices');
- if (threaded && data.in_reply_to_status_id) {
- // aho!
- var parent = $('#notice-' + data.in_reply_to_status_id);
- if (parent.length == 0) {
- // @todo fetch the original, insert it, and finish the rest
- } else {
- // Check the parent notice to make sure it's not a reply itself.
- // If so, use it's parent as the parent.
- var parentList = parent.closest('.notices');
- if (parentList.hasClass('threaded-replies')) {
- parent = parentList.closest('.notice');
- }
- list = parent.find('.threaded-replies');
- if (list.length == 0) {
- list = $('<ul class="notices threaded-replies xoxo"></ul>');
- parent.append(list);
+ RealtimeUpdate.makeNoticeItem(data, function(noticeItem) {
+ var noticeItemID = $(noticeItem).attr('id');
+
+ var list = $("#notices_primary .notices:first")
+ var prepend = true;
+
+ var threaded = list.hasClass('threaded-notices');
+ if (threaded && data.in_reply_to_status_id) {
+ // aho!
+ var parent = $('#notice-' + data.in_reply_to_status_id);
+ if (parent.length == 0) {
+ // @todo fetch the original, insert it, and finish the rest
+ } else {
+ // Check the parent notice to make sure it's not a reply itself.
+ // If so, use it's parent as the parent.
+ var parentList = parent.closest('.notices');
+ if (parentList.hasClass('threaded-replies')) {
+ parent = parentList.closest('.notice');
+ }
+ list = parent.find('.threaded-replies');
+ if (list.length == 0) {
+ list = $('<ul class="notices threaded-replies xoxo"></ul>');
+ parent.append(list);
+ }
+ prepend = false;
}
- prepend = false;
}
- }
- var newNotice = $(noticeItem);
- if (prepend) {
- list.prepend(newNotice);
- } else {
- var placeholder = list.find('li.notice-reply-placeholder')
- if (placeholder.length > 0) {
- newNotice.insertBefore(placeholder)
+ var newNotice = $(noticeItem);
+ if (prepend) {
+ list.prepend(newNotice);
} else {
- newNotice.appendTo(list);
- SN.U.NoticeInlineReplyPlaceholder(parent);
+ var placeholder = list.find('li.notice-reply-placeholder')
+ if (placeholder.length > 0) {
+ newNotice.insertBefore(placeholder)
+ } else {
+ newNotice.appendTo(list);
+ SN.U.NoticeInlineReplyPlaceholder(parent);
+ }
}
- }
- newNotice.css({display:"none"}).fadeIn(1000);
+ newNotice.css({display:"none"}).fadeIn(1000);
- SN.U.NoticeReplyTo($('#'+noticeItemID));
- SN.U.NoticeWithAttachment($('#'+noticeItemID));
+ SN.U.NoticeReplyTo($('#'+noticeItemID));
+ SN.U.NoticeWithAttachment($('#'+noticeItemID));
+ });
},
/**
},
/**
- * Builds a notice HTML block from JSON API-style data.
+ * Builds a notice HTML block from JSON API-style data;
+ * loads data from server, so runs async.
*
* @param {Object} data: extended JSON API-formatted notice
- * @return {String} HTML fragment
- *
- * @fixme this replicates core StatusNet code, making maintenance harder
- * @fixme sloppy HTML building (raw concat without escaping)
- * @fixme no i18n support
- * @fixme local variables pollute global namespace
+ * @param {function} callback: function(DOMNode) to receive new code
*
* @access private
*/
- makeNoticeItem: function(data)
+ makeNoticeItem: function(data, callback)
{
- if (data.hasOwnProperty('retweeted_status')) {
- original = data['retweeted_status'];
- repeat = data;
- data = original;
- unique = repeat['id'];
- responsible = repeat['user'];
- } else {
- original = null;
- repeat = null;
- unique = data['id'];
- responsible = data['user'];
- }
-
- user = data['user'];
- html = data['html'].replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/&/g,'&');
- source = data['source'].replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/&/g,'&');
-
- ni = "<li class=\"hentry notice\" id=\"notice-"+unique+"\">"+
- "<div class=\"entry-title\">"+
- "<span class=\"vcard author\">"+
- "<a href=\""+user['profile_url']+"\" class=\"url\" title=\""+user['name']+"\">"+
- "<img src=\""+user['profile_image_url']+"\" class=\"avatar photo\" width=\"48\" height=\"48\" alt=\""+user['screen_name']+"\"/>"+
- "<span class=\"nickname fn\">"+user['screen_name']+"</span>"+
- "</a>"+
- "</span>"+
- "<p class=\"entry-content\">"+html+"</p>"+
- "</div>"+
- "<div class=\"entry-content\">"+
- "<a class=\"timestamp\" rel=\"bookmark\" href=\""+data['url']+"\" >"+
- "<abbr class=\"published\" title=\""+data['created_at']+"\">a few seconds ago</abbr>"+
- "</a> "+
- "<span class=\"source\">"+
- "from "+
- "<span class=\"device\">"+source+"</span>"+ // may have a link
- "</span>";
- if (data['conversation_url']) {
- ni = ni+" <a class=\"response\" href=\""+data['conversation_url']+"\">in context</a>";
- }
-
- if (repeat) {
- ru = repeat['user'];
- ni = ni + "<span class=\"repeat vcard\">Repeated by " +
- "<a href=\"" + ru['profile_url'] + "\" class=\"url\">" +
- "<span class=\"nickname\">"+ ru['screen_name'] + "</span></a></span>";
- }
-
- ni = ni+"</div>";
-
- ni = ni + "<div class=\"notice-options\">";
-
- if (RealtimeUpdate._userid != 0) {
- var input = $("form#form_notice fieldset input#token");
- var session_key = input.val();
- ni = ni+RealtimeUpdate.makeFavoriteForm(data['id'], session_key);
- ni = ni+RealtimeUpdate.makeReplyLink(data['id'], data['user']['screen_name']);
- if (RealtimeUpdate._userid == responsible['id']) {
- ni = ni+RealtimeUpdate.makeDeleteLink(data['id']);
- } else if (RealtimeUpdate._userid != user['id']) {
- ni = ni+RealtimeUpdate.makeRepeatForm(data['id'], session_key);
- }
- }
-
- ni = ni+"</div>";
-
- ni = ni+"</li>";
- return ni;
+ var url = RealtimeUpdate._showurl.replace('0000000000', data.id);
+ $.get(url, {ajax: 1}, function(data, textStatus, xhr) {
+ var notice = $('li.notice:first', data);
+ if (notice.length) {
+ var node = document._importNode(notice[0], true);
+ callback(node);
+ }
+ });
},
/**
-RealtimeUpdate={_userid:0,_replyurl:"",_favorurl:"",_repeaturl:"",_deleteurl:"",_updatecounter:0,_maxnotices:50,_windowhasfocus:true,_documenttitle:"",_paused:false,_queuedNotices:[],init:function(c,b,d,e,a){RealtimeUpdate._userid=c;RealtimeUpdate._replyurl=b;RealtimeUpdate._favorurl=d;RealtimeUpdate._repeaturl=e;RealtimeUpdate._deleteurl=a;RealtimeUpdate._documenttitle=document.title;$(window).bind("focus",function(){RealtimeUpdate._windowhasfocus=true;RealtimeUpdate._updatecounter=0;RealtimeUpdate.removeWindowCounter()});$(window).bind("blur",function(){$("#notices_primary .notice").removeClass("mark-top");$("#notices_primary .notice:first").addClass("mark-top");RealtimeUpdate._windowhasfocus=false;return false})},receive:function(a){if(RealtimeUpdate.isNoticeVisible(a.id)){return}if(RealtimeUpdate._paused===false){RealtimeUpdate.purgeLastNoticeItem();RealtimeUpdate.insertNoticeItem(a)}else{RealtimeUpdate._queuedNotices.push(a);RealtimeUpdate.updateQueuedCounter()}RealtimeUpdate.updateWindowCounter()},insertNoticeItem:function(b){if(RealtimeUpdate.isNoticeVisible(b.id)){return}var a=RealtimeUpdate.makeNoticeItem(b);var c=$(a).attr("id");var d=$("#notices_primary .notices:first");var j=true;var e=d.hasClass("threaded-notices");if(e&&b.in_reply_to_status_id){var g=$("#notice-"+b.in_reply_to_status_id);if(g.length==0){}else{var h=g.closest(".notices");if(h.hasClass("threaded-replies")){g=h.closest(".notice")}d=g.find(".threaded-replies");if(d.length==0){d=$('<ul class="notices threaded-replies xoxo"></ul>');g.append(d)}j=false}}var i=$(a);if(j){d.prepend(i)}else{var f=d.find("li.notice-reply-placeholder");if(f.length>0){i.insertBefore(f)}else{i.appendTo(d);SN.U.NoticeInlineReplyPlaceholder(g)}}i.css({display:"none"}).fadeIn(1000);SN.U.NoticeReplyTo($("#"+c));SN.U.NoticeWithAttachment($("#"+c))},isNoticeVisible:function(a){return($("#notice-"+a).length>0)},purgeLastNoticeItem:function(){if($("#notices_primary .notice").length>RealtimeUpdate._maxnotices){$("#notices_primary .notice:last").remove()}},updateWindowCounter:function(){if(RealtimeUpdate._windowhasfocus===false){RealtimeUpdate._updatecounter+=1;document.title="("+RealtimeUpdate._updatecounter+") "+RealtimeUpdate._documenttitle}},removeWindowCounter:function(){document.title=RealtimeUpdate._documenttitle},makeNoticeItem:function(c){if(c.hasOwnProperty("retweeted_status")){original=c.retweeted_status;repeat=c;c=original;unique=repeat.id;responsible=repeat.user}else{original=null;repeat=null;unique=c.id;responsible=c.user}user=c.user;html=c.html.replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/&/g,"&");source=c.source.replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/&/g,"&");ni='<li class="hentry notice" id="notice-'+unique+'"><div class="entry-title"><span class="vcard author"><a href="'+user.profile_url+'" class="url" title="'+user.name+'"><img src="'+user.profile_image_url+'" class="avatar photo" width="48" height="48" alt="'+user.screen_name+'"/><span class="nickname fn">'+user.screen_name+'</span></a></span><p class="entry-content">'+html+'</p></div><div class="entry-content"><a class="timestamp" rel="bookmark" href="'+c.url+'" ><abbr class="published" title="'+c.created_at+'">a few seconds ago</abbr></a> <span class="source">from <span class="device">'+source+"</span></span>";if(c.conversation_url){ni=ni+' <a class="response" href="'+c.conversation_url+'">in context</a>'}if(repeat){ru=repeat.user;ni=ni+'<span class="repeat vcard">Repeated by <a href="'+ru.profile_url+'" class="url"><span class="nickname">'+ru.screen_name+"</span></a></span>"}ni=ni+"</div>";ni=ni+'<div class="notice-options">';if(RealtimeUpdate._userid!=0){var a=$("form#form_notice fieldset input#token");var b=a.val();ni=ni+RealtimeUpdate.makeFavoriteForm(c.id,b);ni=ni+RealtimeUpdate.makeReplyLink(c.id,c.user["screen_name"]);if(RealtimeUpdate._userid==responsible.id){ni=ni+RealtimeUpdate.makeDeleteLink(c.id)}else{if(RealtimeUpdate._userid!=user.id){ni=ni+RealtimeUpdate.makeRepeatForm(c.id,b)}}}ni=ni+"</div>";ni=ni+"</li>";return ni},makeFavoriteForm:function(c,b){var a;a='<form id="favor-'+c+'" class="form_favor" method="post" action="'+RealtimeUpdate._favorurl+'"><fieldset><legend>Favor this notice</legend><input name="token-'+c+'" type="hidden" id="token-'+c+'" value="'+b+'"/><input name="notice" type="hidden" id="notice-n'+c+'" value="'+c+'"/><input type="submit" id="favor-submit-'+c+'" name="favor-submit-'+c+'" class="submit" value="Favor" title="Favor this notice"/></fieldset></form>';return a},makeReplyLink:function(c,a){var b;b='<a class="notice_reply" href="'+RealtimeUpdate._replyurl+"?replyto="+a+'" title="Reply to this notice">Reply <span class="notice_id">'+c+"</span></a>";return b},makeRepeatForm:function(c,b){var a;a='<form id="repeat-'+c+'" class="form_repeat" method="post" action="'+RealtimeUpdate._repeaturl+'"><fieldset><legend>Repeat this notice?</legend><input name="token-'+c+'" type="hidden" id="token-'+c+'" value="'+b+'"/><input name="notice" type="hidden" id="notice-'+c+'" value="'+c+'"/><input type="submit" id="repeat-submit-'+c+'" name="repeat-submit-'+c+'" class="submit" value="Yes" title="Repeat this notice"/></fieldset></form>';return a},makeDeleteLink:function(c){var b,a;a=RealtimeUpdate._deleteurl.replace("0000000000",c);b='<a class="notice_delete" href="'+a+'" title="Delete this notice">Delete</a>';return b},initActions:function(a,b,c){$("#notices_primary").prepend('<ul id="realtime_actions"><li id="realtime_playpause"></li><li id="realtime_timeline"></li></ul>');RealtimeUpdate._pluginPath=c;RealtimeUpdate.initPlayPause();RealtimeUpdate.initAddPopup(a,b,RealtimeUpdate._pluginPath)},initPlayPause:function(){if(typeof(localStorage)=="undefined"){RealtimeUpdate.showPause()}else{if(localStorage.getItem("RealtimeUpdate_paused")==="true"){RealtimeUpdate.showPlay()}else{RealtimeUpdate.showPause()}}},showPause:function(){RealtimeUpdate.setPause(false);RealtimeUpdate.showQueuedNotices();RealtimeUpdate.addNoticesHover();$("#realtime_playpause").remove();$("#realtime_actions").prepend('<li id="realtime_playpause"><button id="realtime_pause" class="pause"></button></li>');$("#realtime_pause").text(SN.msg("realtime_pause")).attr("title",SN.msg("realtime_pause_tooltip")).bind("click",function(){RealtimeUpdate.removeNoticesHover();RealtimeUpdate.showPlay();return false})},showPlay:function(){RealtimeUpdate.setPause(true);$("#realtime_playpause").remove();$("#realtime_actions").prepend('<li id="realtime_playpause"><span id="queued_counter"></span> <button id="realtime_play" class="play"></button></li>');$("#realtime_play").text(SN.msg("realtime_play")).attr("title",SN.msg("realtime_play_tooltip")).bind("click",function(){RealtimeUpdate.showPause();return false})},setPause:function(a){RealtimeUpdate._paused=a;if(typeof(localStorage)!="undefined"){localStorage.setItem("RealtimeUpdate_paused",RealtimeUpdate._paused)}},showQueuedNotices:function(){$.each(RealtimeUpdate._queuedNotices,function(a,b){RealtimeUpdate.insertNoticeItem(b)});RealtimeUpdate._queuedNotices=[];RealtimeUpdate.removeQueuedCounter()},updateQueuedCounter:function(){$("#realtime_playpause #queued_counter").html("("+RealtimeUpdate._queuedNotices.length+")")},removeQueuedCounter:function(){$("#realtime_playpause #queued_counter").empty()},addNoticesHover:function(){$("#notices_primary .notices").hover(function(){if(RealtimeUpdate._paused===false){RealtimeUpdate.showPlay()}},function(){if(RealtimeUpdate._paused===true){RealtimeUpdate.showPause()}})},removeNoticesHover:function(){$("#notices_primary .notices").unbind()},initAddPopup:function(a,b,c){$("#realtime_timeline").append('<button id="realtime_popup"></button>');$("#realtime_popup").text(SN.msg("realtime_popup")).attr("title",SN.msg("realtime_popup_tooltip")).bind("click",function(){window.open(a,"","toolbar=no,resizable=yes,scrollbars=yes,status=no,menubar=no,personalbar=no,location=no,width=500,height=550");return false})},initPopupWindow:function(){$(".notices .entry-title a, .notices .entry-content a").bind("click",function(){window.open(this.href,"");return false});$("#showstream .entity_profile").css({width:"69%"})}};
\ No newline at end of file
+RealtimeUpdate={_userid:0,_showurl:"",_updatecounter:0,_maxnotices:50,_windowhasfocus:true,_documenttitle:"",_paused:false,_queuedNotices:[],init:function(a,b){RealtimeUpdate._userid=a;RealtimeUpdate._showurl=b;RealtimeUpdate._documenttitle=document.title;$(window).bind("focus",function(){RealtimeUpdate._windowhasfocus=true;RealtimeUpdate._updatecounter=0;RealtimeUpdate.removeWindowCounter()});$(window).bind("blur",function(){$("#notices_primary .notice").removeClass("mark-top");$("#notices_primary .notice:first").addClass("mark-top");RealtimeUpdate._windowhasfocus=false;return false})},receive:function(a){if(RealtimeUpdate.isNoticeVisible(a.id)){return}if(RealtimeUpdate._paused===false){RealtimeUpdate.purgeLastNoticeItem();RealtimeUpdate.insertNoticeItem(a)}else{RealtimeUpdate._queuedNotices.push(a);RealtimeUpdate.updateQueuedCounter()}RealtimeUpdate.updateWindowCounter()},insertNoticeItem:function(a){if(RealtimeUpdate.isNoticeVisible(a.id)){return}RealtimeUpdate.makeNoticeItem(a,function(b){var c=$(b).attr("id");var d=$("#notices_primary .notices:first");var j=true;var e=d.hasClass("threaded-notices");if(e&&a.in_reply_to_status_id){var g=$("#notice-"+a.in_reply_to_status_id);if(g.length==0){}else{var h=g.closest(".notices");if(h.hasClass("threaded-replies")){g=h.closest(".notice")}d=g.find(".threaded-replies");if(d.length==0){d=$('<ul class="notices threaded-replies xoxo"></ul>');g.append(d)}j=false}}var i=$(b);if(j){d.prepend(i)}else{var f=d.find("li.notice-reply-placeholder");if(f.length>0){i.insertBefore(f)}else{i.appendTo(d);SN.U.NoticeInlineReplyPlaceholder(g)}}i.css({display:"none"}).fadeIn(1000);SN.U.NoticeReplyTo($("#"+c));SN.U.NoticeWithAttachment($("#"+c))})},isNoticeVisible:function(a){return($("#notice-"+a).length>0)},purgeLastNoticeItem:function(){if($("#notices_primary .notice").length>RealtimeUpdate._maxnotices){$("#notices_primary .notice:last").remove()}},updateWindowCounter:function(){if(RealtimeUpdate._windowhasfocus===false){RealtimeUpdate._updatecounter+=1;document.title="("+RealtimeUpdate._updatecounter+") "+RealtimeUpdate._documenttitle}},removeWindowCounter:function(){document.title=RealtimeUpdate._documenttitle},makeNoticeItem:function(b,c){var a=RealtimeUpdate._showurl.replace("0000000000",b.id);$.get(a,{ajax:1},function(f,h,g){var e=$("li.notice:first",f);if(e.length){var d=document._importNode(e[0],true);c(d)}})},makeFavoriteForm:function(c,b){var a;a='<form id="favor-'+c+'" class="form_favor" method="post" action="'+RealtimeUpdate._favorurl+'"><fieldset><legend>Favor this notice</legend><input name="token-'+c+'" type="hidden" id="token-'+c+'" value="'+b+'"/><input name="notice" type="hidden" id="notice-n'+c+'" value="'+c+'"/><input type="submit" id="favor-submit-'+c+'" name="favor-submit-'+c+'" class="submit" value="Favor" title="Favor this notice"/></fieldset></form>';return a},makeReplyLink:function(c,a){var b;b='<a class="notice_reply" href="'+RealtimeUpdate._replyurl+"?replyto="+a+'" title="Reply to this notice">Reply <span class="notice_id">'+c+"</span></a>";return b},makeRepeatForm:function(c,b){var a;a='<form id="repeat-'+c+'" class="form_repeat" method="post" action="'+RealtimeUpdate._repeaturl+'"><fieldset><legend>Repeat this notice?</legend><input name="token-'+c+'" type="hidden" id="token-'+c+'" value="'+b+'"/><input name="notice" type="hidden" id="notice-'+c+'" value="'+c+'"/><input type="submit" id="repeat-submit-'+c+'" name="repeat-submit-'+c+'" class="submit" value="Yes" title="Repeat this notice"/></fieldset></form>';return a},makeDeleteLink:function(c){var b,a;a=RealtimeUpdate._deleteurl.replace("0000000000",c);b='<a class="notice_delete" href="'+a+'" title="Delete this notice">Delete</a>';return b},initActions:function(a,b,c){$("#notices_primary").prepend('<ul id="realtime_actions"><li id="realtime_playpause"></li><li id="realtime_timeline"></li></ul>');RealtimeUpdate._pluginPath=c;RealtimeUpdate.initPlayPause();RealtimeUpdate.initAddPopup(a,b,RealtimeUpdate._pluginPath)},initPlayPause:function(){if(typeof(localStorage)=="undefined"){RealtimeUpdate.showPause()}else{if(localStorage.getItem("RealtimeUpdate_paused")==="true"){RealtimeUpdate.showPlay()}else{RealtimeUpdate.showPause()}}},showPause:function(){RealtimeUpdate.setPause(false);RealtimeUpdate.showQueuedNotices();RealtimeUpdate.addNoticesHover();$("#realtime_playpause").remove();$("#realtime_actions").prepend('<li id="realtime_playpause"><button id="realtime_pause" class="pause"></button></li>');$("#realtime_pause").text(SN.msg("realtime_pause")).attr("title",SN.msg("realtime_pause_tooltip")).bind("click",function(){RealtimeUpdate.removeNoticesHover();RealtimeUpdate.showPlay();return false})},showPlay:function(){RealtimeUpdate.setPause(true);$("#realtime_playpause").remove();$("#realtime_actions").prepend('<li id="realtime_playpause"><span id="queued_counter"></span> <button id="realtime_play" class="play"></button></li>');$("#realtime_play").text(SN.msg("realtime_play")).attr("title",SN.msg("realtime_play_tooltip")).bind("click",function(){RealtimeUpdate.showPause();return false})},setPause:function(a){RealtimeUpdate._paused=a;if(typeof(localStorage)!="undefined"){localStorage.setItem("RealtimeUpdate_paused",RealtimeUpdate._paused)}},showQueuedNotices:function(){$.each(RealtimeUpdate._queuedNotices,function(a,b){RealtimeUpdate.insertNoticeItem(b)});RealtimeUpdate._queuedNotices=[];RealtimeUpdate.removeQueuedCounter()},updateQueuedCounter:function(){$("#realtime_playpause #queued_counter").html("("+RealtimeUpdate._queuedNotices.length+")")},removeQueuedCounter:function(){$("#realtime_playpause #queued_counter").empty()},addNoticesHover:function(){$("#notices_primary .notices").hover(function(){if(RealtimeUpdate._paused===false){RealtimeUpdate.showPlay()}},function(){if(RealtimeUpdate._paused===true){RealtimeUpdate.showPause()}})},removeNoticesHover:function(){$("#notices_primary .notices").unbind()},initAddPopup:function(a,b,c){$("#realtime_timeline").append('<button id="realtime_popup"></button>');$("#realtime_popup").text(SN.msg("realtime_popup")).attr("title",SN.msg("realtime_popup_tooltip")).bind("click",function(){window.open(a,"","toolbar=no,resizable=yes,scrollbars=yes,status=no,menubar=no,personalbar=no,location=no,width=500,height=550");return false})},initPopupWindow:function(){$(".notices .entry-title a, .notices .entry-content a").bind("click",function(){window.open(this.href,"");return false});$("#showstream .entity_profile").css({width:"69%"})}};
\ No newline at end of file
--- /dev/null
+<?php
+/**
+ * Data class to store local search subscriptions
+ *
+ * PHP version 5
+ *
+ * @category SearchSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link http://status.net/
+ *
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * 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/>.
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+/**
+ * For storing the search subscriptions
+ *
+ * @category PollPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link http://status.net/
+ *
+ * @see DB_DataObject
+ */
+
+class SearchSub extends Managed_DataObject
+{
+ public $__table = 'searchsub'; // table name
+ public $search; // text
+ public $profile_id; // int -> profile.id
+ public $created; // datetime
+
+ /**
+ * Get an instance by key
+ *
+ * This is a utility method to get a single instance with a given key value.
+ *
+ * @param string $k Key to use to lookup (usually 'user_id' for this class)
+ * @param mixed $v Value to lookup
+ *
+ * @return SearchSub object found, or null for no hits
+ *
+ */
+ function staticGet($k, $v=null)
+ {
+ return Memcached_DataObject::staticGet('SearchSub', $k, $v);
+ }
+
+ /**
+ * Get an instance by compound key
+ *
+ * This is a utility method to get a single instance with a given set of
+ * key-value pairs. Usually used for the primary key for a compound key; thus
+ * the name.
+ *
+ * @param array $kv array of key-value mappings
+ *
+ * @return SearchSub object found, or null for no hits
+ *
+ */
+ function pkeyGet($kv)
+ {
+ return Memcached_DataObject::pkeyGet('SearchSub', $kv);
+ }
+
+ /**
+ * The One True Thingy that must be defined and declared.
+ */
+ public static function schemaDef()
+ {
+ return array(
+ 'description' => 'SearchSubPlugin search subscription records',
+ 'fields' => array(
+ 'search' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'hash search associated with this subscription'),
+ 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'profile ID of subscribing user'),
+ 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
+ ),
+ 'primary key' => array('search', 'profile_id'),
+ 'foreign keys' => array(
+ 'searchsub_profile_id_fkey' => array('profile', array('profile_id' => 'id')),
+ ),
+ 'indexes' => array(
+ 'searchsub_created_idx' => array('created'),
+ 'searchsub_profile_id_tag_idx' => array('profile_id', 'search'),
+ ),
+ );
+ }
+
+ /**
+ * Start a search subscription!
+ *
+ * @param profile $profile subscriber
+ * @param string $search subscribee
+ * @return SearchSub
+ */
+ static function start(Profile $profile, $search)
+ {
+ $ts = new SearchSub();
+ $ts->search = $search;
+ $ts->profile_id = $profile->id;
+ $ts->created = common_sql_now();
+ $ts->insert();
+ return $ts;
+ }
+
+ /**
+ * End a search subscription!
+ *
+ * @param profile $profile subscriber
+ * @param string $search subscribee
+ */
+ static function cancel(Profile $profile, $search)
+ {
+ $ts = SearchSub::pkeyGet(array('search' => $search,
+ 'profile_id' => $profile->id));
+ if ($ts) {
+ $ts->delete();
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * A plugin to enable local tab subscription
+ *
+ * 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 SearchSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@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')) {
+ exit(1);
+}
+
+/**
+ * SearchSub plugin main class
+ *
+ * @category SearchSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brionv@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 SearchSubPlugin extends Plugin
+{
+ const VERSION = '0.1';
+
+ /**
+ * Database schema setup
+ *
+ * @see Schema
+ *
+ * @return boolean hook value; true means continue processing, false means stop.
+ */
+ function onCheckSchema()
+ {
+ $schema = Schema::get();
+ $schema->ensureTable('searchsub', SearchSub::schemaDef());
+ return true;
+ }
+
+ /**
+ * Load related modules when needed
+ *
+ * @param string $cls Name of the class to be loaded
+ *
+ * @return boolean hook value; true means continue processing, false means stop.
+ */
+ function onAutoload($cls)
+ {
+ $dir = dirname(__FILE__);
+
+ switch ($cls)
+ {
+ case 'SearchSub':
+ include_once $dir.'/'.$cls.'.php';
+ return false;
+ case 'SearchsubAction':
+ case 'SearchunsubAction':
+ case 'SearchsubsAction':
+ case 'SearchSubForm':
+ case 'SearchUnsubForm':
+ case 'SearchSubTrackCommand':
+ case 'SearchSubTrackOffCommand':
+ case 'SearchSubTrackingCommand':
+ case 'SearchSubUntrackCommand':
+ include_once $dir.'/'.strtolower($cls).'.php';
+ return false;
+ default:
+ return true;
+ }
+ }
+
+ /**
+ * Map URLs to actions
+ *
+ * @param Net_URL_Mapper $m path-to-action mapper
+ *
+ * @return boolean hook value; true means continue processing, false means stop.
+ */
+ function onRouterInitialized($m)
+ {
+ $m->connect('search/:search/subscribe',
+ array('action' => 'searchsub'),
+ array('search' => Router::REGEX_TAG));
+ $m->connect('search/:search/unsubscribe',
+ array('action' => 'searchunsub'),
+ array('search' => Router::REGEX_TAG));
+
+ $m->connect(':nickname/search-subscriptions',
+ array('action' => 'searchsubs'),
+ array('nickname' => Nickname::DISPLAY_FMT));
+ return true;
+ }
+
+ /**
+ * Plugin version data
+ *
+ * @param array &$versions array of version data
+ *
+ * @return value
+ */
+ function onPluginVersion(&$versions)
+ {
+ $versions[] = array('name' => 'SearchSub',
+ 'version' => self::VERSION,
+ 'author' => 'Brion Vibber',
+ 'homepage' => 'http://status.net/wiki/Plugin:SearchSub',
+ 'rawdescription' =>
+ // TRANS: Plugin description.
+ _m('Plugin to allow following all messages with a given search.'));
+ return true;
+ }
+
+ /**
+ * Hook inbox delivery setup so search subscribers receive all
+ * notices with that search in their inbox.
+ *
+ * Currently makes no distinction between local messages and
+ * remote ones which happen to come in to the system. Remote
+ * notices that don't come in at all won't ever reach this.
+ *
+ * @param Notice $notice
+ * @param array $ni in/out map of profile IDs to inbox constants
+ * @return boolean hook result
+ */
+ function onStartNoticeWhoGets(Notice $notice, array &$ni)
+ {
+ // Warning: this is potentially very slow
+ // with a lot of searches!
+ $sub = new SearchSub();
+ $sub->groupBy('search');
+ $sub->find();
+ while ($sub->fetch()) {
+ $search = $sub->search;
+
+ if ($this->matchSearch($notice, $search)) {
+ // Match? Find all those who subscribed to this
+ // search term and get our delivery on...
+ $searchsub = new SearchSub();
+ $searchsub->search = $search;
+ $searchsub->find();
+
+ while ($searchsub->fetch()) {
+ // These constants are currently not actually used, iirc
+ $ni[$searchsub->profile_id] = NOTICE_INBOX_SOURCE_SUB;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Does the given notice match the given fulltext search query?
+ *
+ * Warning: not guaranteed to match other search engine behavior, etc.
+ * Currently using a basic case-insensitive substring match, which
+ * probably fits with the 'LIKE' search but not the default MySQL
+ * or Sphinx search backends.
+ *
+ * @param Notice $notice
+ * @param string $search
+ * @return boolean
+ */
+ function matchSearch(Notice $notice, $search)
+ {
+ return (mb_stripos($notice->content, $search) !== false);
+ }
+
+ /**
+ *
+ * @param NoticeSearchAction $action
+ * @param string $q
+ * @param Notice $notice
+ * @return boolean hook result
+ */
+ function onStartNoticeSearchShowResults($action, $q, $notice)
+ {
+ $user = common_current_user();
+ if ($user) {
+ $search = $q;
+ $searchsub = SearchSub::pkeyGet(array('search' => $search,
+ 'profile_id' => $user->id));
+ if ($searchsub) {
+ $form = new SearchUnsubForm($action, $search);
+ } else {
+ $form = new SearchSubForm($action, $search);
+ }
+ $action->elementStart('div', 'entity_actions');
+ $action->elementStart('ul');
+ $action->elementStart('li', 'entity_subscribe');
+ $form->show();
+ $action->elementEnd('li');
+ $action->elementEnd('ul');
+ $action->elementEnd('div');
+ }
+ return true;
+ }
+
+ /**
+ * Menu item for personal subscriptions/groups area
+ *
+ * @param Widget $widget Widget being executed
+ *
+ * @return boolean hook return
+ */
+
+ function onEndSubGroupNav($widget)
+ {
+ $action = $widget->out;
+ $action_name = $action->trimmed('action');
+
+ $action->menuItem(common_local_url('searchsubs', array('nickname' => $action->user->nickname)),
+ // TRANS: SearchSub plugin menu item on user settings page.
+ _m('MENU', 'Searches'),
+ // TRANS: SearchSub plugin tooltip for user settings menu item.
+ _m('Configure search subscriptions'),
+ $action_name == 'searchsubs' && $action->arg('nickname') == $action->user->nickname);
+
+ return true;
+ }
+
+ /**
+ * Add a count of mirrored feeds into a user's profile sidebar stats.
+ *
+ * @param Profile $profile
+ * @param array $stats
+ * @return boolean hook return value
+ */
+ function onProfileStats($profile, &$stats)
+ {
+ $cur = common_current_user();
+ if (!empty($cur) && $cur->id == $profile->id) {
+ $searchsub = new SearchSub();
+ $searchsub ->profile_id = $profile->id;
+ $entry = array(
+ 'id' => 'searchsubs',
+ 'label' => _m('Search subscriptions'),
+ 'link' => common_local_url('searchsubs', array('nickname' => $profile->nickname)),
+ 'value' => $searchsub->count(),
+ );
+
+ $insertAt = count($stats);
+ foreach ($stats as $i => $row) {
+ if ($row['id'] == 'groups') {
+ // Slip us in after them.
+ $insertAt = $i + 1;
+ break;
+ }
+ }
+ array_splice($stats, $insertAt, 0, array($entry));
+ }
+ return true;
+ }
+
+ /**
+ * Replace the built-in stub track commands with ones that control
+ * search subscriptions.
+ *
+ * @param CommandInterpreter $cmd
+ * @param string $arg
+ * @param User $user
+ * @param Command $result
+ * @return boolean hook result
+ */
+ function onEndInterpretCommand($cmd, $arg, $user, &$result)
+ {
+ if ($result instanceof TrackCommand) {
+ $result = new SearchSubTrackCommand($user, $arg);
+ return false;
+ } else if ($result instanceof TrackOffCommand) {
+ $result = new SearchSubTrackOffCommand($user);
+ return false;
+ } else if ($result instanceof TrackingCommand) {
+ $result = new SearchSubTrackingCommand($user);
+ return false;
+ } else if ($result instanceof UntrackCommand) {
+ $result = new SearchSubUntrackCommand($user, $arg);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ function onHelpCommandMessages($cmd, &$commands)
+ {
+ // TRANS: Help message for IM/SMS command "track <word>"
+ $commands["track <word>"] = _m('COMMANDHELP', "Start following notices matching the given search query.");
+ // TRANS: Help message for IM/SMS command "untrack <word>"
+ $commands["untrack <word>"] = _m('COMMANDHELP', "Stop following notices matching the given search query.");
+ // TRANS: Help message for IM/SMS command "track off"
+ $commands["track off"] = _m('COMMANDHELP', "Disable all tracked search subscriptions.");
+ // TRANS: Help message for IM/SMS command "untrack all"
+ $commands["untrack all"] = _m('COMMANDHELP', "Disable all tracked search subscriptions.");
+ // TRANS: Help message for IM/SMS command "tracks"
+ $commands["tracks"] = _m('COMMANDHELP', "List all your search subscriptions.");
+ // TRANS: Help message for IM/SMS command "tracking"
+ $commands["tracking"] = _m('COMMANDHELP', "List all your search subscriptions.");
+ }
+}
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. TRANS: Header for subscriptions overview for a user (first page).
+#. TRANS: %s is a user nickname.
+#: searchsubsaction.php:51
+#, php-format
+msgid "%s's search subscriptions"
+msgstr ""
+
+#. TRANS: Header for subscriptions overview for a user (not first page).
+#. TRANS: %1$s is a user nickname, %2$d is the page number.
+#: searchsubsaction.php:55
+#, php-format
+msgid "%1$s's search subscriptions, page %2$d"
+msgstr ""
+
+#. TRANS: Page notice for page with an overview of all search subscriptions
+#. TRANS: of the logged in user's own profile.
+#: searchsubsaction.php:68
+msgid ""
+"You have subscribed to receive all notices on this site matching the "
+"following searches:"
+msgstr ""
+
+#. TRANS: Page notice for page with an overview of all subscriptions of a user other
+#. TRANS: than the logged in user. %s is the user nickname.
+#: searchsubsaction.php:73
+#, php-format
+msgid ""
+"%s has subscribed to receive all notices on this site matching the following "
+"searches:"
+msgstr ""
+
+#. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none
+#. TRANS: as an anonymous user. %s is the user nickname.
+#: searchsubsaction.php:130
+#, php-format
+msgid "%s is not subscribed to any searches."
+msgstr ""
+
+#: searchsubsaction.php:168
+#, php-format
+msgid "\"<a href=\"%s\">%s</a>\" since %s"
+msgstr ""
+
+#. TRANS: Error text shown a user tries to untrack a search query they're not subscribed to.
+#: searchsubuntrackcommand.php:21
+#, php-format
+msgid "You are not tracking the search \"%s\"."
+msgstr ""
+
+#. TRANS: Message given having failed to cancel a search subscription by untrack command.
+#: searchsubuntrackcommand.php:29
+#, php-format
+msgid "Could not end a search subscription for query \"%s\"."
+msgstr ""
+
+#. TRANS: Message given having removed a search subscription by untrack command.
+#: searchsubuntrackcommand.php:35
+#, php-format
+msgid "You are no longer subscribed to the search \"%s\"."
+msgstr ""
+
+#. TRANS: Page title when search subscription succeeded.
+#: searchsubaction.php:136
+msgid "Subscribed"
+msgstr ""
+
+#: searchunsubform.php:96 searchunsubform.php:107
+msgid "Unsubscribe from this search"
+msgstr ""
+
+#. TRANS: Page title when search unsubscription succeeded.
+#: searchunsubaction.php:76
+msgid "Unsubscribed"
+msgstr ""
+
+#. TRANS: Error text shown a user tries to track a search query they're already subscribed to.
+#: searchsubtrackcommand.php:21
+#, php-format
+msgid "You are already tracking the search \"%s\"."
+msgstr ""
+
+#. TRANS: Message given having failed to set up a search subscription by track command.
+#: searchsubtrackcommand.php:29
+#, php-format
+msgid "Could not start a search subscription for query \"%s\"."
+msgstr ""
+
+#. TRANS: Message given having added a search subscription by track command.
+#: searchsubtrackcommand.php:35
+#, php-format
+msgid "You are subscribed to the search \"%s\"."
+msgstr ""
+
+#. TRANS: Plugin description.
+#: SearchSubPlugin.php:132
+msgid "Plugin to allow following all messages with a given search."
+msgstr ""
+
+#. TRANS: SearchSub plugin menu item on user settings page.
+#: SearchSubPlugin.php:236
+msgctxt "MENU"
+msgid "Searches"
+msgstr ""
+
+#. TRANS: SearchSub plugin tooltip for user settings menu item.
+#: SearchSubPlugin.php:238
+msgid "Configure search subscriptions"
+msgstr ""
+
+#: SearchSubPlugin.php:259
+msgid "Search subscriptions"
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "track <word>"
+#: SearchSubPlugin.php:309
+msgctxt "COMMANDHELP"
+msgid "Start following notices matching the given search query."
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "untrack <word>"
+#: SearchSubPlugin.php:311
+msgctxt "COMMANDHELP"
+msgid "Stop following notices matching the given search query."
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "track off"
+#. TRANS: Help message for IM/SMS command "untrack all"
+#: SearchSubPlugin.php:313 SearchSubPlugin.php:315
+msgctxt "COMMANDHELP"
+msgid "Disable all tracked search subscriptions."
+msgstr ""
+
+#. TRANS: Help message for IM/SMS command "tracks"
+#. TRANS: Help message for IM/SMS command "tracking"
+#: SearchSubPlugin.php:317 SearchSubPlugin.php:319
+msgctxt "COMMANDHELP"
+msgid "List all your search subscriptions."
+msgstr ""
+
+#. TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none.
+#: searchsubtrackingcommand.php:14 searchsubtrackoffcommand.php:14
+msgid "You are not tracking any searches."
+msgstr ""
+
+#. TRANS: Message given having disabled all search subscriptions with 'track off'.
+#: searchsubtrackingcommand.php:24
+#, php-format
+msgid "You are tracking searches for: %s"
+msgstr ""
+
+#: searchsubform.php:116 searchsubform.php:140
+msgid "Subscribe to this search"
+msgstr ""
+
+#. TRANS: Message given having failed to cancel one of the search subs with 'track off' command.
+#: searchsubtrackoffcommand.php:24
+#, php-format
+msgid "Error disabling search subscription for query \"%s\"."
+msgstr ""
+
+#. TRANS: Message given having disabled all search subscriptions with 'track off'.
+#: searchsubtrackoffcommand.php:31
+msgid "Disabled all your search subscriptions."
+msgstr ""
--- /dev/null
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2008-2011, StatusNet, Inc.
+ *
+ * Search subscription action.
+ *
+ * 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/>.
+ *
+ * PHP version 5
+ *
+ * @category Action
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2008-2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+/**
+ * Search subscription action
+ *
+ * Takes parameters:
+ *
+ * - token: session token to prevent CSRF attacks
+ * - ajax: boolean; whether to return Ajax or full-browser results
+ *
+ * Only works if the current user is logged in.
+ *
+ * @category Action
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @author Brion Vibber <brion@status.net>
+ * @copyright 2008-2011 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link http://status.net/
+ */
+class SearchsubAction extends Action
+{
+ var $user;
+ var $search;
+
+ /**
+ * Check pre-requisites and instantiate attributes
+ *
+ * @param Array $args array of arguments (URL, GET, POST)
+ *
+ * @return boolean success flag
+ */
+ function prepare($args)
+ {
+ parent::prepare($args);
+ if ($this->boolean('ajax')) {
+ StatusNet::setApi(true);
+ }
+
+ // Only allow POST requests
+
+ if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+ // TRANS: Client error displayed trying to perform any request method other than POST.
+ // TRANS: Do not translate POST.
+ $this->clientError(_('This action only accepts POST requests.'));
+ return false;
+ }
+
+ // CSRF protection
+
+ $token = $this->trimmed('token');
+
+ if (!$token || $token != common_session_token()) {
+ // TRANS: Client error displayed when the session token is not okay.
+ $this->clientError(_('There was a problem with your session token.'.
+ ' Try again, please.'));
+ return false;
+ }
+
+ // Only for logged-in users
+
+ $this->user = common_current_user();
+
+ if (empty($this->user)) {
+ // TRANS: Client error displayed trying to subscribe when not logged in.
+ $this->clientError(_('Not logged in.'));
+ return false;
+ }
+
+ // Profile to subscribe to
+
+ $this->search = $this->arg('search');
+
+ if (empty($this->search)) {
+ // TRANS: Client error displayed trying to subscribe to a non-existing profile.
+ $this->clientError(_('No such profile.'));
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Handle request
+ *
+ * Does the subscription and returns results.
+ *
+ * @param Array $args unused.
+ *
+ * @return void
+ */
+ function handle($args)
+ {
+ // Throws exception on error
+
+ SearchSub::start($this->user->getProfile(),
+ $this->search);
+
+ if ($this->boolean('ajax')) {
+ $this->startHTML('text/xml;charset=utf-8');
+ $this->elementStart('head');
+ // TRANS: Page title when search subscription succeeded.
+ $this->element('title', null, _m('Subscribed'));
+ $this->elementEnd('head');
+ $this->elementStart('body');
+ $unsubscribe = new SearchUnsubForm($this, $this->search);
+ $unsubscribe->show();
+ $this->elementEnd('body');
+ $this->elementEnd('html');
+ } else {
+ $url = common_local_url('search',
+ array('search' => $this->search));
+ common_redirect($url, 303);
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Form for subscribing to a search
+ *
+ * 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 SearchSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@status.net>
+ * @copyright 2009-2011 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);
+}
+
+/**
+ * Form for subscribing to a user
+ *
+ * @category SearchSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@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 UnsubscribeForm
+ */
+
+class SearchSubForm extends Form
+{
+ /**
+ * Name of search to subscribe to
+ */
+
+ var $search = '';
+
+ /**
+ * Constructor
+ *
+ * @param HTMLOutputter $out output channel
+ * @param string $search name of search to subscribe to
+ */
+
+ function __construct($out=null, $search=null)
+ {
+ parent::__construct($out);
+
+ $this->search = $search;
+ }
+
+ /**
+ * ID of the form
+ *
+ * @return int ID of the form
+ */
+
+ function id()
+ {
+ return 'search-subscribe-' . $this->search;
+ }
+
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ // class to match existing styles...
+ return 'form_user_subscribe ajax';
+ }
+
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('searchsub', array('search' => $this->search));
+ }
+
+
+ /**
+ * Legend of the Form
+ *
+ * @return void
+ */
+ function formLegend()
+ {
+ $this->out->element('legend', null, _m('Subscribe to this search'));
+ }
+
+ /**
+ * Data elements of the form
+ *
+ * @return void
+ */
+
+ function formData()
+ {
+ $this->out->hidden('subscribeto-' . $this->search,
+ $this->search,
+ 'subscribeto');
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Subscribe'), 'submit', null, _m('Subscribe to this search'));
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * List of a user's subscriptions
+ *
+ * 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 Social
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@status.net>
+ * @copyright 2008-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);
+}
+
+/**
+ * A list of the user's subscriptions
+ *
+ * @category Social
+ * @package StatusNet
+ * @author Evan Prodromou <evan@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/
+ */
+class SearchSubsAction extends GalleryAction
+{
+ function title()
+ {
+ if ($this->page == 1) {
+ // TRANS: Header for subscriptions overview for a user (first page).
+ // TRANS: %s is a user nickname.
+ return sprintf(_m('%s\'s search subscriptions'), $this->user->nickname);
+ } else {
+ // TRANS: Header for subscriptions overview for a user (not first page).
+ // TRANS: %1$s is a user nickname, %2$d is the page number.
+ return sprintf(_m('%1$s\'s search subscriptions, page %2$d'),
+ $this->user->nickname,
+ $this->page);
+ }
+ }
+
+ function showPageNotice()
+ {
+ $user = common_current_user();
+ if ($user && ($user->id == $this->profile->id)) {
+ $this->element('p', null,
+ // TRANS: Page notice for page with an overview of all search subscriptions
+ // TRANS: of the logged in user's own profile.
+ _m('You have subscribed to receive all notices on this site matching the following searches:'));
+ } else {
+ $this->element('p', null,
+ // TRANS: Page notice for page with an overview of all subscriptions of a user other
+ // TRANS: than the logged in user. %s is the user nickname.
+ sprintf(_m('%s has subscribed to receive all notices on this site matching the following searches:'),
+ $this->profile->nickname));
+ }
+ }
+
+ function showContent()
+ {
+ if (Event::handle('StartShowTagSubscriptionsContent', array($this))) {
+ parent::showContent();
+
+ $offset = ($this->page-1) * PROFILES_PER_PAGE;
+ $limit = PROFILES_PER_PAGE + 1;
+
+ $cnt = 0;
+
+ $searchsub = new SearchSub();
+ $searchsub->profile_id = $this->user->id;
+ $searchsub->limit($limit, $offset);
+ $searchsub->find();
+
+ if ($searchsub->N) {
+ $list = new SearchSubscriptionsList($searchsub, $this->user, $this);
+ $cnt = $list->show();
+ if (0 == $cnt) {
+ $this->showEmptyListMessage();
+ }
+ } else {
+ $this->showEmptyListMessage();
+ }
+
+ $this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE,
+ $this->page, 'searchsubs',
+ array('nickname' => $this->user->nickname));
+
+
+ Event::handle('EndShowTagSubscriptionsContent', array($this));
+ }
+ }
+
+ function showEmptyListMessage()
+ {
+ if (common_logged_in()) {
+ $current_user = common_current_user();
+ if ($this->user->id === $current_user->id) {
+ // TRANS: Search subscription list text when the logged in user has no search subscriptions.
+ $message = _m('You are not subscribed to any text searches right now. You can push the "Subscribe" button ' .
+ 'on any notice text search to automatically receive any public messages on this site that match that ' .
+ 'search, even if you are not subscribed to the poster.');
+ } else {
+ // TRANS: Search subscription list text when looking at the subscriptions for a of a user other
+ // TRANS: than the logged in user that has no search subscriptions. %s is the user nickname.
+ $message = sprintf(_m('%s is not subscribed to any searches.'), $this->user->nickname);
+ }
+ }
+ else {
+ // TRANS: Subscription list text when looking at the subscriptions for a of a user that has none
+ // TRANS: as an anonymous user. %s is the user nickname.
+ $message = sprintf(_m('%s is not subscribed to any searches.'), $this->user->nickname);
+ }
+
+ $this->elementStart('div', 'guide');
+ $this->raw(common_markup_to_html($message));
+ $this->elementEnd('div');
+ }
+}
+
+// XXX SubscriptionsList and SubscriptionList are dangerously close
+
+class SearchSubscriptionsList extends SubscriptionList
+{
+ function newListItem($searchsub)
+ {
+ return new SearchSubscriptionsListItem($searchsub, $this->owner, $this->action);
+ }
+}
+
+class SearchSubscriptionsListItem extends SubscriptionListItem
+{
+ function startItem()
+ {
+ $this->out->elementStart('li', array('class' => 'searchsub'));
+ }
+
+ function showProfile()
+ {
+ $searchsub = $this->profile;
+ $search = $searchsub->search;
+
+ // Relevant portion!
+ $cur = common_current_user();
+ if (!empty($cur) && $cur->id == $this->owner->id) {
+ $this->showOwnerControls();
+ }
+
+ $url = common_local_url('noticesearch', array('q' => $search));
+ // TRANS: Search subscription list item. %1$s is a URL to a notice search,
+ // TRANS: %2$s are the search criteria, %3$s is a datestring.
+ $linkline = sprintf(_m('"<a href="%1$s">%2$s</a>" since %3$s'),
+ htmlspecialchars($url),
+ htmlspecialchars($search),
+ common_date_string($searchsub->created));
+
+ $this->out->elementStart('div', 'searchsub-item');
+ $this->out->raw($linkline);
+ $this->out->element('div', array('style' => 'clear: both'));
+ $this->out->elementEnd('div');
+ }
+
+ function showActions()
+ {
+ }
+
+ function showOwnerControls()
+ {
+ $this->out->elementStart('div', 'entity_actions');
+
+ $searchsub = $this->profile; // ?
+ $form = new SearchUnsubForm($this->out, $searchsub->search);
+ $form->show();
+
+ $this->out->elementEnd('div');
+ return;
+ }
+}
--- /dev/null
+<?php
+
+class SearchSubTrackCommand extends Command
+{
+ var $keyword = null;
+
+ function __construct($user, $keyword)
+ {
+ parent::__construct($user);
+ $this->keyword = $keyword;
+ }
+
+ function handle($channel)
+ {
+ $cur = $this->user;
+ $searchsub = SearchSub::pkeyGet(array('search' => $this->keyword,
+ 'profile_id' => $cur->id));
+
+ if ($searchsub) {
+ // TRANS: Error text shown a user tries to track a search query they're already subscribed to.
+ $channel->error($cur, sprintf(_m('You are already tracking the search "%s".'), $this->keyword));
+ return;
+ }
+
+ try {
+ SearchSub::start($cur->getProfile(), $this->keyword);
+ } catch (Exception $e) {
+ // TRANS: Message given having failed to set up a search subscription by track command.
+ $channel->error($cur, sprintf(_m('Could not start a search subscription for query "%s".'),
+ $this->keyword));
+ return;
+ }
+
+ // TRANS: Message given having added a search subscription by track command.
+ $channel->output($cur, sprintf(_m('You are subscribed to the search "%s".'),
+ $this->keyword));
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+
+class SearchSubTrackingCommand extends Command
+{
+ function handle($channel)
+ {
+ $cur = $this->user;
+ $all = new SearchSub();
+ $all->profile_id = $cur->id;
+ $all->find();
+
+ if ($all->N == 0) {
+ // TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none.
+ $channel->error($cur, _m('You are not tracking any searches.'));
+ return;
+ }
+
+ $list = array();
+ while ($all->fetch()) {
+ $list[] = $all->search;
+ }
+
+ // TRANS: Message given having disabled all search subscriptions with 'track off'.
+ $channel->output($cur, sprintf(_m('You are tracking searches for: %s'),
+ '"' . implode('", "', $list) . '"'));
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+
+class SearchSubTrackoffCommand extends Command
+{
+ function handle($channel)
+ {
+ $cur = $this->user;
+ $all = new SearchSub();
+ $all->profile_id = $cur->id;
+ $all->find();
+
+ if ($all->N == 0) {
+ // TRANS: Error text shown a user tries to disable all a search subscriptions with track off command, but has none.
+ $channel->error($cur, _m('You are not tracking any searches.'));
+ return;
+ }
+
+ $profile = $cur->getProfile();
+ while ($all->fetch()) {
+ try {
+ SearchSub::cancel($profile, $all->search);
+ } catch (Exception $e) {
+ // TRANS: Message given having failed to cancel one of the search subs with 'track off' command.
+ $channel->error($cur, sprintf(_m('Error disabling search subscription for query "%s".'),
+ $all->search));
+ return;
+ }
+ }
+
+ // TRANS: Message given having disabled all search subscriptions with 'track off'.
+ $channel->output($cur, _m('Disabled all your search subscriptions.'));
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+
+class SearchSubUntrackCommand extends Command
+{
+ var $keyword = null;
+
+ function __construct($user, $keyword)
+ {
+ parent::__construct($user);
+ $this->keyword = $keyword;
+ }
+
+ function handle($channel)
+ {
+ $cur = $this->user;
+ $searchsub = SearchSub::pkeyGet(array('search' => $this->keyword,
+ 'profile_id' => $cur->id));
+
+ if (!$searchsub) {
+ // TRANS: Error text shown a user tries to untrack a search query they're not subscribed to.
+ $channel->error($cur, sprintf(_m('You are not tracking the search "%s".'), $this->keyword));
+ return;
+ }
+
+ try {
+ SearchSub::cancel($cur->getProfile(), $this->keyword);
+ } catch (Exception $e) {
+ // TRANS: Message given having failed to cancel a search subscription by untrack command.
+ $channel->error($cur, sprintf(_m('Could not end a search subscription for query "%s".'),
+ $this->keyword));
+ return;
+ }
+
+ // TRANS: Message given having removed a search subscription by untrack command.
+ $channel->output($cur, sprintf(_m('You are no longer subscribed to the search "%s".'),
+ $this->keyword));
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2008-2011, StatusNet, Inc.
+ *
+ * Search subscription action.
+ *
+ * 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/>.
+ *
+ * PHP version 5
+ *
+ * @category Action
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2008-2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+/**
+ * Search unsubscription action
+ *
+ * Takes parameters:
+ *
+ * - token: session token to prevent CSRF attacks
+ * - ajax: boolean; whether to return Ajax or full-browser results
+ *
+ * Only works if the current user is logged in.
+ *
+ * @category Action
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @author Brion Vibber <brion@status.net>
+ * @copyright 2008-2011 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link http://status.net/
+ */
+class SearchunsubAction extends SearchsubAction
+{
+ /**
+ * Handle request
+ *
+ * Does the subscription and returns results.
+ *
+ * @param Array $args unused.
+ *
+ * @return void
+ */
+ function handle($args)
+ {
+ // Throws exception on error
+
+ SearchSub::cancel($this->user->getProfile(),
+ $this->search);
+
+ if ($this->boolean('ajax')) {
+ $this->startHTML('text/xml;charset=utf-8');
+ $this->elementStart('head');
+ // TRANS: Page title when search unsubscription succeeded.
+ $this->element('title', null, _m('Unsubscribed'));
+ $this->elementEnd('head');
+ $this->elementStart('body');
+ $subscribe = new SearchSubForm($this, $this->search);
+ $subscribe->show();
+ $this->elementEnd('body');
+ $this->elementEnd('html');
+ } else {
+ $url = common_local_url('search',
+ array('search' => $this->search));
+ common_redirect($url, 303);
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Form for subscribing to a search
+ *
+ * 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 SearchSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@status.net>
+ * @copyright 2009-2011 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);
+}
+
+/**
+ * Form for subscribing to a user
+ *
+ * @category SearchSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@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 UnsubscribeForm
+ */
+
+class SearchUnsubForm extends SearchSubForm
+{
+ /**
+ * ID of the form
+ *
+ * @return int ID of the form
+ */
+
+ function id()
+ {
+ return 'search-unsubscribe-' . $this->search;
+ }
+
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ // class to match existing styles...
+ return 'form_user_unsubscribe ajax';
+ }
+
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('searchunsub', array('search' => $this->search));
+ }
+
+
+ /**
+ * Legend of the Form
+ *
+ * @return void
+ */
+ function formLegend()
+ {
+ $this->out->element('legend', null, _m('Unsubscribe from this search'));
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Unsubscribe'), 'submit', null, _m('Unsubscribe from this search'));
+ }
+}
# Translation of StatusNet - ShareNotice to Telugu (తెలుగు)
-# Expored from translatewiki.net
+# Exported from translatewiki.net
#
# Author: Veeven
# --
msgstr ""
"Project-Id-Version: StatusNet - ShareNotice\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-16 15:08+0000\n"
-"PO-Revision-Date: 2010-12-16 15:12:54+0000\n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:19:17+0000\n"
"Language-Team: Telugu <http://translatewiki.net/wiki/Portal:te>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2010-11-30 20:43:55+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r78478); Translate extension (2010-09-17)\n"
+"X-POT-Import-Date: 2011-03-06 02:18:45+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: te\n"
"X-Message-Group: #out-statusnet-plugin-sharenotice\n"
#. TRANS: Leave this message unchanged.
#. TRANS: %s is notice content that is shared on Twitter, Facebook or another platform.
-#: ShareNoticePlugin.php:106 ShareNoticePlugin.php:194
#, php-format
msgid "\"%s\""
msgstr "\"%s\""
#. TRANS: Tooltip for image to share a notice on Twitter.
-#: ShareNoticePlugin.php:130
msgid "Share on Twitter"
-msgstr ""
+msgstr "ట్విట్టర్లో పంచుకోండి"
#. TRANS: Tooltip for image to share a notice on another platform (other than Twitter or Facebook).
#. TRANS: %s is a host name.
-#: ShareNoticePlugin.php:163
#, php-format
msgid "Share on %s"
msgstr ""
#. TRANS: Tooltip for image to share a notice on Facebook.
-#: ShareNoticePlugin.php:186
msgid "Share on Facebook"
-msgstr ""
+msgstr "ఫేస్బుక్లో పంచుకోండి"
#. TRANS: Plugin description.
-#: ShareNoticePlugin.php:219
msgid ""
"This plugin allows sharing of notices to Twitter, Facebook and other "
"platforms."
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Transfer-Encoding: 8bit\n"
#. TRANS: Server exception thrown when a database name cannot be identified.
-#: sphinxsearch.php:96
+#: sphinxsearch.php:126
msgid "Sphinx search could not identify database name."
msgstr ""
{
$m->connect('settings/mirror',
array('action' => 'mirrorsettings'));
+ $m->connect('settings/mirror/add/:provider',
+ array('action' => 'mirrorsettings'),
+ array('provider' => '[A-Za-z0-9_-]+'));
$m->connect('settings/mirror/add',
array('action' => 'addmirror'));
$m->connect('settings/mirror/edit',
function prepare($args)
{
parent::prepare($args);
- $this->feedurl = $this->validateFeedUrl($this->trimmed('feedurl'));
+ $feedurl = $this->getFeedUrl();
+ $this->feedurl = $this->validateFeedUrl($feedurl);
$this->profile = $this->profileForFeed($this->feedurl);
return true;
}
+ function getFeedUrl()
+ {
+ $provider = $this->trimmed('provider');
+ switch ($provider) {
+ case 'feed':
+ return $this->trimmed('feedurl');
+ case 'twitter':
+ $screenie = $this->trimmed('screen_name');
+ $base = 'http://api.twitter.com/1/statuses/user_timeline.atom?screen_name=';
+ return $base . urlencode($screenie);
+ default:
+ throw new Exception('Internal form error: unrecognized feed provider.');
+ }
+ }
+
function saveMirror()
{
if ($this->oprofile->subscribe()) {
if (common_valid_http_url($url)) {
return $url;
} else {
- $this->clientError(_m("Invalid feed URL."));
+ // TRANS: Client error displayed when entering an invalid URL for a feed.
+ // TRANS: %s is the invalid feed URL.
+ $this->clientError(sprintf(_m("Invalid feed URL: %s."), $url));
}
}
if ($profile && $profile->id != $this->user->id) {
return $profile;
}
- // TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed.
- $this->clientError(_m("Invalid profile for mirroring."));
+ // TRANS: Error message returned to user when setting up feed mirroring,
+ // TRANS: but we were unable to resolve the given URL to a working feed.
+ $this->clientError(_m('Invalid profile for mirroring.'));
}
/**
$oprofile = Ostatus_profile::ensureFeedURL($url);
}
if ($oprofile->isGroup()) {
- $this->clientError(_m("Can't mirror a StatusNet group at this time."));
+ $this->clientError(_m("Cannot mirror a StatusNet group at this time."));
}
$this->oprofile = $oprofile; // @fixme ugly side effect :D
return $oprofile->localProfile();
function showContent()
{
$user = common_current_user();
+ $provider = $this->trimmed('provider');
+ if ($provider) {
+ $this->showAddFeedForm($provider);
+ } else {
+ $this->elementStart('div', array('id' => 'add-mirror'));
+ $this->showAddWizard();
+ $this->elementEnd('div');
- $this->showAddFeedForm();
-
- $mirror = new SubMirror();
- $mirror->subscriber = $user->id;
- if ($mirror->find()) {
- while ($mirror->fetch()) {
- $this->showFeedForm($mirror);
+ $mirror = new SubMirror();
+ $mirror->subscriber = $user->id;
+ if ($mirror->find()) {
+ while ($mirror->fetch()) {
+ $this->showFeedForm($mirror);
+ }
}
}
}
+ function showAddWizard()
+ {
+ $form = new AddMirrorWizard($this);
+ $form->show();
+ }
+
function showFeedForm($mirror)
{
$profile = Profile::staticGet('id', $mirror->subscribed);
function showAddFeedForm()
{
- $form = new AddMirrorForm($this);
+ switch ($this->arg('provider')) {
+ case 'statusnet':
+ break;
+ case 'twitter':
+ $form = new AddTwitterMirrorForm($this);
+ break;
+ case 'wordpress':
+ break;
+ case 'linkedin':
+ break;
+ case 'feed':
+ default:
+ $form = new AddMirrorForm($this);
+ }
$form->show();
}
+ /**
+ *
+ * @param array $args
+ *
+ * @todo move the ajax display handling to common code
+ */
+ function handle($args)
+ {
+ if ($this->boolean('ajax')) {
+ header('Content-Type: text/html;charset=utf-8');
+ $this->elementStart('html');
+ $this->elementStart('head');
+ $this->element('title', null, _('Provider add'));
+ $this->elementEnd('head');
+ $this->elementStart('body');
+
+ $this->showAddFeedForm();
+
+ $this->elementEnd('body');
+ $this->elementEnd('html');
+ } else {
+ return parent::handle($args);
+ }
+ }
/**
* Handle a POST request
*
$nav = new SubGroupNav($this, common_current_user());
$nav->show();
}
+
+ function showScripts()
+ {
+ parent::showScripts();
+ $this->script('plugins/SubMirror/js/mirrorsettings.js');
+ }
+
+ function showStylesheets()
+ {
+ parent::showStylesheets();
+ $this->cssLink('plugins/SubMirror/css/mirrorsettings.css');
+ }
}
--- /dev/null
+/* undo insane stuff from core styles */
+#add-mirror-wizard img {
+ display: inline;
+}
+
+/* we need #something to override most of the #content crap */
+
+#add-mirror-wizard {
+ margin-left: 20px;
+ margin-right: 20px;
+}
+
+#add-mirror-wizard .provider-list table {
+ width: 100%;
+}
+
+#add-mirror-wizard .provider-heading img {
+ vertical-align: middle;
+}
+#add-mirror-wizard .provider-heading {
+ cursor: pointer;
+}
+#add-mirror-wizard .provider-detail fieldset {
+ margin-top: 8px; /* hack */
+ margin-bottom: 8px; /* hack */
+}
\ No newline at end of file
--- /dev/null
+$(function() {
+ /**
+ * Append 'ajax=1' parameter onto URL.
+ */
+ function ajaxize(url) {
+ if (url.indexOf('?') == '-1') {
+ return url + '?ajax=1';
+ } else {
+ return url + '&ajax=1';
+ }
+ }
+
+ var addMirror = $('#add-mirror');
+ var wizard = $('#add-mirror-wizard');
+ if (wizard.length > 0) {
+ var list = wizard.find('.provider-list');
+ var providers = list.find('.provider-heading');
+ providers.click(function(event) {
+ console.log(this);
+ var targetUrl = $(this).find('a').attr('href');
+ if (targetUrl) {
+ // Make sure we don't accidentally follow the direct link
+ event.preventDefault();
+
+ var node = this;
+ function showNew() {
+ var detail = $('<div class="provider-detail" style="display: none"></div>').insertAfter(node);
+ detail.load(ajaxize(targetUrl), function(responseText, testStatus, xhr) {
+ detail.slideDown('fast', function() {
+ detail.find('input[type="text"]').focus();
+ });
+ });
+ }
+
+ var old = addMirror.find('.provider-detail');
+ if (old.length) {
+ old.slideUp('fast', function() {
+ old.remove();
+ showNew();
+ });
+ } else {
+ showNew();
+ }
+ }
+ });
+ }
+});
\ No newline at end of file
*/
function formData()
{
+ $this->out->hidden('provider', 'feed');
$this->out->elementStart('fieldset');
$this->out->elementStart('ul');
$this->out->elementEnd('fieldset');
}
- private function doInput($id, $name, $label, $value=null, $instructions=null)
+ protected function doInput($id, $name, $label, $value=null, $instructions=null)
{
$this->out->element('label', array('for' => $id), $label);
$attrs = array('name' => $name,
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ * 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/>.
+ *
+ * @package StatusNet
+ * @copyright 2010-2011 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);
+}
+
+class AddMirrorWizard extends Widget
+{
+ /**
+ * Name of the form
+ *
+ * Sub-classes should overload this with the name of their form.
+ *
+ * @return void
+ */
+ function formLegend()
+ {
+ }
+
+ /**
+ * Visible or invisible data elements
+ *
+ * Display the form fields that make up the data of the form.
+ * Sub-classes should overload this to show their data.
+ *
+ * @return void
+ */
+ function show()
+ {
+ $this->out->elementStart('div', array('id' => 'add-mirror-wizard'));
+
+ $providers = $this->providers();
+ $this->showProviders($providers);
+
+ $this->out->elementEnd('div');
+ }
+
+ function providers()
+ {
+ return array(
+ /*
+ // We could accept hostname & username combos here, or
+ // webfingery combinations as for remote users.
+ array(
+ 'id' => 'statusnet',
+ 'name' => _m('StatusNet'),
+ ),
+ */
+ // Accepts a Twitter username and pulls their user timeline as a
+ // public Atom feed. Requires a working alternate hub which, one
+ // hopes, is getting timely updates.
+ array(
+ 'id' => 'twitter',
+ 'name' => _m('Twitter'),
+ ),
+ /*
+ // WordPress was on our list some whiles ago, but not sure
+ // what we can actually do here. Search on Wordpress.com hosted
+ // sites, or ?
+ array(
+ 'id' => 'wordpress',
+ 'name' => _m('WordPress'),
+ ),
+ */
+ /*
+ // In theory, Facebook lets you pull public updates over RSS,
+ // but the URLs for your own update feed that I can find from
+ // 2009-era websites no longer seem to work and there's no
+ // good current documentation. May not still be available...
+ // Mirroring from an FB account is probably better done with
+ // the dedicated plugin. (As of March 2011)
+ array(
+ 'id' => 'facebook',
+ 'name' => _m('Facebook'),
+ ),
+ */
+ /*
+ // LinkedIn doesn't currently seem to have public feeds
+ // for users or groups (March 2011)
+ array(
+ 'id' => 'linkedin',
+ 'name' => _m('LinkedIn'),
+ ),
+ */
+ array(
+ 'id' => 'feed',
+ 'name' => _m('RSS or Atom feed'),
+ ),
+ );
+ }
+
+ function showProviders(array $providers)
+ {
+ $out = $this->out;
+
+ $out->elementStart('div', 'provider-list');
+ $out->element('h2', null, _m('Select a feed provider'));
+ $out->elementStart('table');
+ foreach ($providers as $provider) {
+ $icon = common_path('plugins/SubMirror/images/providers/' . $provider['id'] . '.png');
+ $targetUrl = common_local_url('mirrorsettings', array('provider' => $provider['id']));
+
+ $out->elementStart('tr', array('class' => 'provider'));
+ $out->elementStart('td');
+
+ $out->elementStart('div', 'provider-heading');
+ $out->element('img', array('src' => $icon));
+ $out->element('a', array('href' => $targetUrl), $provider['name']);
+ $out->elementEnd('div');
+
+ $out->elementEnd('td');
+ $out->elementEnd('tr');
+ }
+ $out->elementEnd('table');
+ $out->elementEnd('div');
+ }
+
+ /**
+ * Buttons for form actions
+ *
+ * Submit and cancel buttons (or whatever)
+ * Sub-classes should overload this to show their own buttons.
+ *
+ * @return void
+ */
+ function formActions()
+ {
+ }
+
+ /**
+ * ID of the form
+ *
+ * Should be unique on the page. Sub-classes should overload this
+ * to show their own IDs.
+ *
+ * @return string ID of the form
+ */
+ function id()
+ {
+ return 'add-mirror-wizard';
+ }
+
+ /**
+ * Action of the form.
+ *
+ * URL to post to. Should be overloaded by subclasses to give
+ * somewhere to post to.
+ *
+ * @return string URL to post to
+ */
+ function action()
+ {
+ return common_local_url('addmirror');
+ }
+
+ /**
+ * Class of the form.
+ *
+ * @return string the form's class
+ */
+ function formClass()
+ {
+ return 'form_settings';
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ * 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/>.
+ *
+ * @package StatusNet
+ * @copyright 2010 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);
+}
+
+class AddTwitterMirrorForm extends AddMirrorForm
+{
+
+ /**
+ * Visible or invisible data elements
+ *
+ * Display the form fields that make up the data of the form.
+ * Sub-classes should overload this to show their data.
+ *
+ * @return void
+ */
+ function formData()
+ {
+ $this->out->hidden('provider', 'twitter');
+ $this->out->elementStart('fieldset');
+
+ $this->out->elementStart('ul');
+
+ $this->li();
+ $this->doInput('addmirror-feedurl',
+ 'screen_name',
+ _m('Twitter username:'),
+ $this->out->trimmed('screen_name'));
+ $this->unli();
+
+ $this->li();
+ $this->out->submit('addmirror-save', _m('BUTTON','Add feed'));
+ $this->unli();
+ $this->out->elementEnd('ul');
+ $this->out->elementEnd('fieldset');
+ }
+}
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: actions/basemirror.php:71
-msgid "Invalid feed URL."
+#. TRANS: Client error displayed when entering an invalid URL for a feed.
+#. TRANS: %s is the invalid feed URL.
+#: actions/basemirror.php:73
+#, php-format
+msgid "Invalid feed URL: %s."
msgstr ""
-#. TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed.
-#: actions/basemirror.php:83
+#. TRANS: Error message returned to user when setting up feed mirroring,
+#. TRANS: but we were unable to resolve the given URL to a working feed.
+#: actions/basemirror.php:86
msgid "Invalid profile for mirroring."
msgstr ""
-#: actions/basemirror.php:101
-msgid "Can't mirror a StatusNet group at this time."
+#: actions/basemirror.php:104
+msgid "Cannot mirror a StatusNet group at this time."
msgstr ""
-#: actions/basemirror.php:115
+#: actions/basemirror.php:118
msgid "This action only accepts POST requests."
msgstr ""
-#: actions/basemirror.php:123
+#: actions/basemirror.php:126
msgid "There was a problem with your session token. Try again, please."
msgstr ""
-#: actions/basemirror.php:133
+#: actions/basemirror.php:136
msgid "Not logged in."
msgstr ""
-#: actions/basemirror.php:156
+#: actions/basemirror.php:159
msgid "Subscribed"
msgstr ""
msgid "Requested edit of missing mirror."
msgstr ""
-#: actions/addmirror.php:72
+#: actions/addmirror.php:88
msgid "Could not subscribe to feed."
msgstr ""
"timeline!"
msgstr ""
-#: SubMirrorPlugin.php:90
+#: SubMirrorPlugin.php:93
msgid "Pull feeds into your timeline!"
msgstr ""
#. TRANS: SubMirror plugin menu item on user settings page.
-#: SubMirrorPlugin.php:110
+#: SubMirrorPlugin.php:113
msgctxt "MENU"
msgid "Mirroring"
msgstr ""
#. TRANS: SubMirror plugin tooltip for user settings menu item.
-#: SubMirrorPlugin.php:112
+#: SubMirrorPlugin.php:115
msgid "Configure mirroring of posts from other feeds"
msgstr ""
-#: SubMirrorPlugin.php:183
+#: SubMirrorPlugin.php:186
msgid "Mirrored feeds"
msgstr ""
-#: lib/addmirrorform.php:59
+#: lib/addmirrorform.php:60
msgid "Web page or feed URL:"
msgstr ""
-#: lib/addmirrorform.php:64
+#: lib/addmirrorform.php:65 lib/addtwittermirrorform.php:55
msgctxt "BUTTON"
msgid "Add feed"
msgstr ""
+#: lib/addtwittermirrorform.php:50
+msgid "Twitter username:"
+msgstr ""
+
#: lib/editmirrorform.php:83
msgctxt "LABEL"
msgid "Remote feed:"
#: lib/editmirrorform.php:117
msgid "Stop mirroring"
msgstr ""
+
+#: lib/addmirrorwizard.php:76
+msgid "Twitter"
+msgstr ""
+
+#: lib/addmirrorwizard.php:109
+msgid "RSS or Atom feed"
+msgstr ""
+
+#: lib/addmirrorwizard.php:119
+msgid "Select a feed provider"
+msgstr ""
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:38:18+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:40:24+0000\n"
"Language-Team: German <http://translatewiki.net/wiki/Portal:de>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 17:47:23+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-17 10:20:13+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: de\n"
"X-Message-Group: #out-statusnet-plugin-submirror\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-msgid "Invalid feed URL."
+#. TRANS: Client error displayed when entering an invalid URL for a feed.
+#. TRANS: %s is the invalid feed URL.
+#, fuzzy, php-format
+msgid "Invalid feed URL: %s."
msgstr "Ungültige Feed-URL."
-#. TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed.
+#. TRANS: Error message returned to user when setting up feed mirroring,
+#. TRANS: but we were unable to resolve the given URL to a working feed.
msgid "Invalid profile for mirroring."
msgstr "Ungültiges Profil für das Spiegeln."
-msgid "Can't mirror a StatusNet group at this time."
+#, fuzzy
+msgid "Cannot mirror a StatusNet group at this time."
msgstr "Kann im Moment keine StatusNet-Gruppe spiegeln."
msgid "This action only accepts POST requests."
msgid "Add feed"
msgstr "Feed hinzufügen"
+msgid "Twitter username:"
+msgstr ""
+
msgctxt "LABEL"
msgid "Remote feed:"
msgstr "Remote-Feed:"
msgid "Stop mirroring"
msgstr "Mit dem Spiegeln aufhören"
+
+msgid "Twitter"
+msgstr ""
+
+msgid "RSS or Atom feed"
+msgstr ""
+
+msgid "Select a feed provider"
+msgstr ""
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:38:18+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:40:24+0000\n"
"Language-Team: French <http://translatewiki.net/wiki/Portal:fr>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 17:47:23+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-17 10:20:13+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: fr\n"
"X-Message-Group: #out-statusnet-plugin-submirror\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-msgid "Invalid feed URL."
+#. TRANS: Client error displayed when entering an invalid URL for a feed.
+#. TRANS: %s is the invalid feed URL.
+#, fuzzy, php-format
+msgid "Invalid feed URL: %s."
msgstr "Adresse URL de flux invalide."
-#. TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed.
+#. TRANS: Error message returned to user when setting up feed mirroring,
+#. TRANS: but we were unable to resolve the given URL to a working feed.
msgid "Invalid profile for mirroring."
msgstr "Profil invalide pour la mise en miroir."
-msgid "Can't mirror a StatusNet group at this time."
+#, fuzzy
+msgid "Cannot mirror a StatusNet group at this time."
msgstr "Impossible de mettre en miroir un groupe StatusNet actuellement."
msgid "This action only accepts POST requests."
msgid "Add feed"
msgstr "Ajouter le flux"
+msgid "Twitter username:"
+msgstr ""
+
msgctxt "LABEL"
msgid "Remote feed:"
msgstr "Flux distant :"
msgid "Stop mirroring"
msgstr "Arrêter le miroir"
+
+msgid "Twitter"
+msgstr ""
+
+msgid "RSS or Atom feed"
+msgstr ""
+
+msgid "Select a feed provider"
+msgstr ""
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:38:18+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:40:24+0000\n"
"Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 17:47:23+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-17 10:20:13+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ia\n"
"X-Message-Group: #out-statusnet-plugin-submirror\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-msgid "Invalid feed URL."
+#. TRANS: Client error displayed when entering an invalid URL for a feed.
+#. TRANS: %s is the invalid feed URL.
+#, fuzzy, php-format
+msgid "Invalid feed URL: %s."
msgstr "URL de syndication invalide."
-#. TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed.
+#. TRANS: Error message returned to user when setting up feed mirroring,
+#. TRANS: but we were unable to resolve the given URL to a working feed.
msgid "Invalid profile for mirroring."
msgstr "Profilo invalide pro republication."
-msgid "Can't mirror a StatusNet group at this time."
+#, fuzzy
+msgid "Cannot mirror a StatusNet group at this time."
msgstr "Al presente il es impossibile republicar un gruppo StatusNet."
msgid "This action only accepts POST requests."
msgid "Add feed"
msgstr "Adder syndication"
+msgid "Twitter username:"
+msgstr ""
+
msgctxt "LABEL"
msgid "Remote feed:"
msgstr "Syndication remote:"
msgid "Stop mirroring"
msgstr "Cessar le republication"
+
+msgid "Twitter"
+msgstr ""
+
+msgid "RSS or Atom feed"
+msgstr ""
+
+msgid "Select a feed provider"
+msgstr ""
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:38:18+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:40:24+0000\n"
"Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 17:47:23+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-17 10:20:13+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: mk\n"
"X-Message-Group: #out-statusnet-plugin-submirror\n"
"Plural-Forms: nplurals=2; plural=(n == 1 || n%10 == 1) ? 0 : 1;\n"
-msgid "Invalid feed URL."
+#. TRANS: Client error displayed when entering an invalid URL for a feed.
+#. TRANS: %s is the invalid feed URL.
+#, fuzzy, php-format
+msgid "Invalid feed URL: %s."
msgstr "Неважечка URL-адреса за каналот."
-#. TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed.
+#. TRANS: Error message returned to user when setting up feed mirroring,
+#. TRANS: but we were unable to resolve the given URL to a working feed.
msgid "Invalid profile for mirroring."
msgstr "Неважечки профил за отсликување."
-msgid "Can't mirror a StatusNet group at this time."
+#, fuzzy
+msgid "Cannot mirror a StatusNet group at this time."
msgstr "Моментално не можам да отсликам група од StatusNet."
msgid "This action only accepts POST requests."
msgid "Add feed"
msgstr "Додај канал"
+msgid "Twitter username:"
+msgstr ""
+
msgctxt "LABEL"
msgid "Remote feed:"
msgstr "Далечински канал:"
msgid "Stop mirroring"
msgstr "Престани со отсликување"
+
+msgid "Twitter"
+msgstr ""
+
+msgid "RSS or Atom feed"
+msgstr ""
+
+msgid "Select a feed provider"
+msgstr ""
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:38:18+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:40:25+0000\n"
"Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 17:47:23+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-17 10:20:13+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: nl\n"
"X-Message-Group: #out-statusnet-plugin-submirror\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-msgid "Invalid feed URL."
-msgstr "Ongeldige URL voor feed."
+#. TRANS: Client error displayed when entering an invalid URL for a feed.
+#. TRANS: %s is the invalid feed URL.
+#, fuzzy, php-format
+msgid "Invalid feed URL: %s."
+msgstr "Ongeldige URL voor feed: %s."
-#. TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed.
+#. TRANS: Error message returned to user when setting up feed mirroring,
+#. TRANS: but we were unable to resolve the given URL to a working feed.
msgid "Invalid profile for mirroring."
msgstr "Ongeldig profiel om te spiegelen."
-msgid "Can't mirror a StatusNet group at this time."
+#, fuzzy
+msgid "Cannot mirror a StatusNet group at this time."
msgstr "Het is niet mogelijk om een StatusNet-groep te spiegelen."
msgid "This action only accepts POST requests."
msgid "Add feed"
msgstr "Feed toevoegen"
+msgid "Twitter username:"
+msgstr "Twitter-gebruikersnaam:"
+
msgctxt "LABEL"
msgid "Remote feed:"
msgstr "Bronfeed:"
msgid "Stop mirroring"
msgstr "Spiegelen beëindigen"
+
+msgid "Twitter"
+msgstr "Twitter"
+
+msgid "RSS or Atom feed"
+msgstr "RSS- of Atom-feed"
+
+msgid "Select a feed provider"
+msgstr "Selecteer een feedprovider"
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:38:18+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:40:25+0000\n"
"Language-Team: Tagalog <http://translatewiki.net/wiki/Portal:tl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 17:47:23+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-17 10:20:13+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: tl\n"
"X-Message-Group: #out-statusnet-plugin-submirror\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-msgid "Invalid feed URL."
+#. TRANS: Client error displayed when entering an invalid URL for a feed.
+#. TRANS: %s is the invalid feed URL.
+#, fuzzy, php-format
+msgid "Invalid feed URL: %s."
msgstr "Hindi tanggap na URL ng pakain."
-#. TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed.
+#. TRANS: Error message returned to user when setting up feed mirroring,
+#. TRANS: but we were unable to resolve the given URL to a working feed.
msgid "Invalid profile for mirroring."
msgstr "Hindi tanggap na balangkas para sa pagsasalamin."
-msgid "Can't mirror a StatusNet group at this time."
+#, fuzzy
+msgid "Cannot mirror a StatusNet group at this time."
msgstr "Hindi maisalamin sa ngayon ang isang pangkat ng StatusNet."
msgid "This action only accepts POST requests."
msgid "Add feed"
msgstr "Idagdag ang pakain"
+msgid "Twitter username:"
+msgstr ""
+
msgctxt "LABEL"
msgid "Remote feed:"
msgstr "Pakaing malayo:"
msgid "Stop mirroring"
msgstr "Ihinto ang pagsasalamin"
+
+msgid "Twitter"
+msgstr ""
+
+msgid "RSS or Atom feed"
+msgstr ""
+
+msgid "Select a feed provider"
+msgstr ""
msgstr ""
"Project-Id-Version: StatusNet - SubMirror\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:38:18+0000\n"
+"POT-Creation-Date: 2011-03-17 12:35+0000\n"
+"PO-Revision-Date: 2011-03-17 12:40:25+0000\n"
"Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 17:47:23+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-17 10:20:13+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: uk\n"
"X-Message-Group: #out-statusnet-plugin-submirror\n"
"Plural-Forms: nplurals=3; plural=(n%10 == 1 && n%100 != 11) ? 0 : ( (n%10 >= "
"2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20)) ? 1 : 2 );\n"
-msgid "Invalid feed URL."
+#. TRANS: Client error displayed when entering an invalid URL for a feed.
+#. TRANS: %s is the invalid feed URL.
+#, fuzzy, php-format
+msgid "Invalid feed URL: %s."
msgstr "Помилкова URL-адреса веб-стрічки."
-#. TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed.
+#. TRANS: Error message returned to user when setting up feed mirroring,
+#. TRANS: but we were unable to resolve the given URL to a working feed.
msgid "Invalid profile for mirroring."
msgstr "Помилковий профіль для віддзеркалення."
-msgid "Can't mirror a StatusNet group at this time."
+#, fuzzy
+msgid "Cannot mirror a StatusNet group at this time."
msgstr "На даний момент не можу віддзеркалювати спільноту на сайті StatusNet."
msgid "This action only accepts POST requests."
msgid "Add feed"
msgstr "Додати веб-стрічку"
+msgid "Twitter username:"
+msgstr ""
+
msgctxt "LABEL"
msgid "Remote feed:"
msgstr "Віддалена веб-стрічка:"
msgid "Stop mirroring"
msgstr "Зупинити віддзеркалення"
+
+msgid "Twitter"
+msgstr ""
+
+msgid "RSS or Atom feed"
+msgstr ""
+
+msgid "Select a feed provider"
+msgstr ""
--- /dev/null
+<?php
+/**
+ * Data class to store local tag subscriptions
+ *
+ * PHP version 5
+ *
+ * @category TagSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link http://status.net/
+ *
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * 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/>.
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+/**
+ * For storing the tag subscriptions
+ *
+ * @category PollPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link http://status.net/
+ *
+ * @see DB_DataObject
+ */
+
+class TagSub extends Managed_DataObject
+{
+ public $__table = 'tagsub'; // table name
+ public $tag; // text
+ public $profile_id; // int -> profile.id
+ public $created; // datetime
+
+ /**
+ * Get an instance by key
+ *
+ * This is a utility method to get a single instance with a given key value.
+ *
+ * @param string $k Key to use to lookup (usually 'user_id' for this class)
+ * @param mixed $v Value to lookup
+ *
+ * @return TagSub object found, or null for no hits
+ *
+ */
+ function staticGet($k, $v=null)
+ {
+ return Memcached_DataObject::staticGet('TagSub', $k, $v);
+ }
+
+ /**
+ * Get an instance by compound key
+ *
+ * This is a utility method to get a single instance with a given set of
+ * key-value pairs. Usually used for the primary key for a compound key; thus
+ * the name.
+ *
+ * @param array $kv array of key-value mappings
+ *
+ * @return TagSub object found, or null for no hits
+ *
+ */
+ function pkeyGet($kv)
+ {
+ return Memcached_DataObject::pkeyGet('TagSub', $kv);
+ }
+
+ /**
+ * The One True Thingy that must be defined and declared.
+ */
+ public static function schemaDef()
+ {
+ return array(
+ 'description' => 'TagSubPlugin tag subscription records',
+ 'fields' => array(
+ 'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'hash tag associated with this subscription'),
+ 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'profile ID of subscribing user'),
+ 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
+ ),
+ 'primary key' => array('tag', 'profile_id'),
+ 'foreign keys' => array(
+ 'tagsub_profile_id_fkey' => array('profile', array('profile_id' => 'id')),
+ ),
+ 'indexes' => array(
+ 'tagsub_created_idx' => array('created'),
+ 'tagsub_profile_id_tag_idx' => array('profile_id', 'tag'),
+ ),
+ );
+ }
+
+ /**
+ * Start a tag subscription!
+ *
+ * @param profile $profile subscriber
+ * @param string $tag subscribee
+ * @return TagSub
+ */
+ static function start(Profile $profile, $tag)
+ {
+ $ts = new TagSub();
+ $ts->tag = $tag;
+ $ts->profile_id = $profile->id;
+ $ts->created = common_sql_now();
+ $ts->insert();
+ return $ts;
+ }
+
+ /**
+ * End a tag subscription!
+ *
+ * @param profile $profile subscriber
+ * @param string $tag subscribee
+ */
+ static function cancel(Profile $profile, $tag)
+ {
+ $ts = TagSub::pkeyGet(array('tag' => $tag,
+ 'profile_id' => $profile->id));
+ if ($ts) {
+ $ts->delete();
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * A plugin to enable local tab subscription
+ *
+ * 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 TagSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@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')) {
+ exit(1);
+}
+
+/**
+ * TagSub plugin main class
+ *
+ * @category TagSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brionv@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 TagSubPlugin extends Plugin
+{
+ const VERSION = '0.1';
+
+ /**
+ * Database schema setup
+ *
+ * @see Schema
+ *
+ * @return boolean hook value; true means continue processing, false means stop.
+ */
+ function onCheckSchema()
+ {
+ $schema = Schema::get();
+ $schema->ensureTable('tagsub', TagSub::schemaDef());
+ return true;
+ }
+
+ /**
+ * Load related modules when needed
+ *
+ * @param string $cls Name of the class to be loaded
+ *
+ * @return boolean hook value; true means continue processing, false means stop.
+ */
+ function onAutoload($cls)
+ {
+ $dir = dirname(__FILE__);
+
+ switch ($cls)
+ {
+ case 'TagSub':
+ include_once $dir.'/'.$cls.'.php';
+ return false;
+ case 'TagsubAction':
+ case 'TagunsubAction':
+ case 'TagsubsAction':
+ case 'TagSubForm':
+ case 'TagUnsubForm':
+ include_once $dir.'/'.strtolower($cls).'.php';
+ return false;
+ default:
+ return true;
+ }
+ }
+
+ /**
+ * Map URLs to actions
+ *
+ * @param Net_URL_Mapper $m path-to-action mapper
+ *
+ * @return boolean hook value; true means continue processing, false means stop.
+ */
+ function onRouterInitialized($m)
+ {
+ $m->connect('tag/:tag/subscribe',
+ array('action' => 'tagsub'),
+ array('tag' => Router::REGEX_TAG));
+ $m->connect('tag/:tag/unsubscribe',
+ array('action' => 'tagunsub'),
+ array('tag' => Router::REGEX_TAG));
+
+ $m->connect(':nickname/tag-subscriptions',
+ array('action' => 'tagsubs'),
+ array('nickname' => Nickname::DISPLAY_FMT));
+ return true;
+ }
+
+ /**
+ * Plugin version data
+ *
+ * @param array &$versions array of version data
+ *
+ * @return value
+ */
+ function onPluginVersion(&$versions)
+ {
+ $versions[] = array('name' => 'TagSub',
+ 'version' => self::VERSION,
+ 'author' => 'Brion Vibber',
+ 'homepage' => 'http://status.net/wiki/Plugin:TagSub',
+ 'rawdescription' =>
+ // TRANS: Plugin description.
+ _m('Plugin to allow following all messages with a given tag.'));
+ return true;
+ }
+
+ /**
+ * Hook inbox delivery setup so tag subscribers receive all
+ * notices with that tag in their inbox.
+ *
+ * Currently makes no distinction between local messages and
+ * remote ones which happen to come in to the system. Remote
+ * notices that don't come in at all won't ever reach this.
+ *
+ * @param Notice $notice
+ * @param array $ni in/out map of profile IDs to inbox constants
+ * @return boolean hook result
+ */
+ function onStartNoticeWhoGets(Notice $notice, array &$ni)
+ {
+ foreach ($notice->getTags() as $tag) {
+ $tagsub = new TagSub();
+ $tagsub->tag = $tag;
+ $tagsub->find();
+
+ while ($tagsub->fetch()) {
+ // These constants are currently not actually used, iirc
+ $ni[$tagsub->profile_id] = NOTICE_INBOX_SOURCE_SUB;
+ }
+ }
+ return true;
+ }
+
+ /**
+ *
+ * @param TagAction $action
+ * @return boolean hook result
+ */
+ function onStartTagShowContent(TagAction $action)
+ {
+ $user = common_current_user();
+ if ($user) {
+ $tag = $action->trimmed('tag');
+ $tagsub = TagSub::pkeyGet(array('tag' => $tag,
+ 'profile_id' => $user->id));
+ if ($tagsub) {
+ $form = new TagUnsubForm($action, $tag);
+ } else {
+ $form = new TagSubForm($action, $tag);
+ }
+ $action->elementStart('div', 'entity_actions');
+ $action->elementStart('ul');
+ $action->elementStart('li', 'entity_subscribe');
+ $form->show();
+ $action->elementEnd('li');
+ $action->elementEnd('ul');
+ $action->elementEnd('div');
+ }
+ return true;
+ }
+
+ /**
+ * Menu item for personal subscriptions/groups area
+ *
+ * @param Widget $widget Widget being executed
+ *
+ * @return boolean hook return
+ */
+
+ function onEndSubGroupNav($widget)
+ {
+ $action = $widget->out;
+ $action_name = $action->trimmed('action');
+
+ $action->menuItem(common_local_url('tagsubs', array('nickname' => $action->user->nickname)),
+ // TRANS: SubMirror plugin menu item on user settings page.
+ _m('MENU', 'Tags'),
+ // TRANS: SubMirror plugin tooltip for user settings menu item.
+ _m('Configure tag subscriptions'),
+ $action_name == 'tagsubs' && $action->arg('nickname') == $action->user->nickname);
+
+ return true;
+ }
+
+ /**
+ * Add a count of mirrored feeds into a user's profile sidebar stats.
+ *
+ * @param Profile $profile
+ * @param array $stats
+ * @return boolean hook return value
+ */
+ function onProfileStats($profile, &$stats)
+ {
+ $cur = common_current_user();
+ if (!empty($cur) && $cur->id == $profile->id) {
+ $tagsub = new TagSub();
+ $tagsub->profile_id = $profile->id;
+ $entry = array(
+ 'id' => 'tagsubs',
+ 'label' => _m('Tag subscriptions'),
+ 'link' => common_local_url('tagsubs', array('nickname' => $profile->nickname)),
+ 'value' => $tagsub->count(),
+ );
+
+ $insertAt = count($stats);
+ foreach ($stats as $i => $row) {
+ if ($row['id'] == 'groups') {
+ // Slip us in after them.
+ $insertAt = $i + 1;
+ break;
+ }
+ }
+ array_splice($stats, $insertAt, 0, array($entry));
+ }
+ return true;
+ }
+}
--- /dev/null
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: tagunsubform.php:96 tagunsubform.php:107
+msgid "Unsubscribe from this tag"
+msgstr ""
+
+#. TRANS: Plugin description.
+#: TagSubPlugin.php:128
+msgid "Plugin to allow following all messages with a given tag."
+msgstr ""
+
+#. TRANS: SubMirror plugin menu item on user settings page.
+#: TagSubPlugin.php:202
+msgctxt "MENU"
+msgid "Tags"
+msgstr ""
+
+#. TRANS: SubMirror plugin tooltip for user settings menu item.
+#: TagSubPlugin.php:204
+msgid "Configure tag subscriptions"
+msgstr ""
+
+#: TagSubPlugin.php:225
+msgid "Tag subscriptions"
+msgstr ""
+
+#: tagsubform.php:116 tagsubform.php:140
+msgid "Subscribe to this tag"
+msgstr ""
+
+#. TRANS: Page title when tag unsubscription succeeded.
+#: tagunsubaction.php:76
+msgid "Unsubscribed"
+msgstr ""
+
+#. TRANS: Page title when tag subscription succeeded.
+#: tagsubaction.php:136
+msgid "Subscribed"
+msgstr ""
+
+#. TRANS: Header for subscriptions overview for a user (first page).
+#. TRANS: %s is a user nickname.
+#: tagsubsaction.php:51
+#, php-format
+msgid "%s's tag subscriptions"
+msgstr ""
+
+#. TRANS: Header for subscriptions overview for a user (not first page).
+#. TRANS: %1$s is a user nickname, %2$d is the page number.
+#: tagsubsaction.php:55
+#, php-format
+msgid "%1$s's tag subscriptions, page %2$d"
+msgstr ""
+
+#. TRANS: Page notice for page with an overview of all tag subscriptions
+#. TRANS: of the logged in user's own profile.
+#: tagsubsaction.php:68
+msgid ""
+"You have subscribed to receive all notices on this site containing the "
+"following tags:"
+msgstr ""
+
+#. TRANS: Page notice for page with an overview of all subscriptions of a user other
+#. TRANS: than the logged in user. %s is the user nickname.
+#: tagsubsaction.php:73
+#, php-format
+msgid ""
+"%s has subscribed to receive all notices on this site containing the "
+"following tags:"
+msgstr ""
+
+#. TRANS: Subscription list text when looking at the subscriptions for a of a user that has none
+#. TRANS: as an anonymous user. %s is the user nickname.
+#: tagsubsaction.php:130
+#, php-format
+msgid "%s is not listening to any tags."
+msgstr ""
+
+#: tagsubsaction.php:168
+#, php-format
+msgid "#<a href=\"%s\">%s</a> since %s"
+msgstr ""
--- /dev/null
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2008-2011, StatusNet, Inc.
+ *
+ * Tag subscription action.
+ *
+ * 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/>.
+ *
+ * PHP version 5
+ *
+ * @category Action
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2008-2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+/**
+ * Tag subscription action
+ *
+ * Takes parameters:
+ *
+ * - token: session token to prevent CSRF attacks
+ * - ajax: boolean; whether to return Ajax or full-browser results
+ *
+ * Only works if the current user is logged in.
+ *
+ * @category Action
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @author Brion Vibber <brion@status.net>
+ * @copyright 2008-2011 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link http://status.net/
+ */
+class TagsubAction extends Action
+{
+ var $user;
+ var $tag;
+
+ /**
+ * Check pre-requisites and instantiate attributes
+ *
+ * @param Array $args array of arguments (URL, GET, POST)
+ *
+ * @return boolean success flag
+ */
+ function prepare($args)
+ {
+ parent::prepare($args);
+ if ($this->boolean('ajax')) {
+ StatusNet::setApi(true);
+ }
+
+ // Only allow POST requests
+
+ if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+ // TRANS: Client error displayed trying to perform any request method other than POST.
+ // TRANS: Do not translate POST.
+ $this->clientError(_('This action only accepts POST requests.'));
+ return false;
+ }
+
+ // CSRF protection
+
+ $token = $this->trimmed('token');
+
+ if (!$token || $token != common_session_token()) {
+ // TRANS: Client error displayed when the session token is not okay.
+ $this->clientError(_('There was a problem with your session token.'.
+ ' Try again, please.'));
+ return false;
+ }
+
+ // Only for logged-in users
+
+ $this->user = common_current_user();
+
+ if (empty($this->user)) {
+ // TRANS: Client error displayed trying to subscribe when not logged in.
+ $this->clientError(_('Not logged in.'));
+ return false;
+ }
+
+ // Profile to subscribe to
+
+ $this->tag = $this->arg('tag');
+
+ if (empty($this->tag)) {
+ // TRANS: Client error displayed trying to subscribe to a non-existing profile.
+ $this->clientError(_('No such profile.'));
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Handle request
+ *
+ * Does the subscription and returns results.
+ *
+ * @param Array $args unused.
+ *
+ * @return void
+ */
+ function handle($args)
+ {
+ // Throws exception on error
+
+ TagSub::start($this->user->getProfile(),
+ $this->tag);
+
+ if ($this->boolean('ajax')) {
+ $this->startHTML('text/xml;charset=utf-8');
+ $this->elementStart('head');
+ // TRANS: Page title when tag subscription succeeded.
+ $this->element('title', null, _m('Subscribed'));
+ $this->elementEnd('head');
+ $this->elementStart('body');
+ $unsubscribe = new TagUnsubForm($this, $this->tag);
+ $unsubscribe->show();
+ $this->elementEnd('body');
+ $this->elementEnd('html');
+ } else {
+ $url = common_local_url('tag',
+ array('tag' => $this->tag));
+ common_redirect($url, 303);
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Form for subscribing to a 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 TagSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@status.net>
+ * @copyright 2009-2011 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);
+}
+
+/**
+ * Form for subscribing to a user
+ *
+ * @category TagSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@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 UnsubscribeForm
+ */
+
+class TagSubForm extends Form
+{
+ /**
+ * Name of tag to subscribe to
+ */
+
+ var $tag = '';
+
+ /**
+ * Constructor
+ *
+ * @param HTMLOutputter $out output channel
+ * @param string $tag name of tag to subscribe to
+ */
+
+ function __construct($out=null, $tag=null)
+ {
+ parent::__construct($out);
+
+ $this->tag = $tag;
+ }
+
+ /**
+ * ID of the form
+ *
+ * @return int ID of the form
+ */
+
+ function id()
+ {
+ return 'tag-subscribe-' . $this->tag;
+ }
+
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ // class to match existing styles...
+ return 'form_user_subscribe ajax';
+ }
+
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('tagsub', array('tag' => $this->tag));
+ }
+
+
+ /**
+ * Legend of the Form
+ *
+ * @return void
+ */
+ function formLegend()
+ {
+ $this->out->element('legend', null, _m('Subscribe to this tag'));
+ }
+
+ /**
+ * Data elements of the form
+ *
+ * @return void
+ */
+
+ function formData()
+ {
+ $this->out->hidden('subscribeto-' . $this->tag,
+ $this->tag,
+ 'subscribeto');
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Subscribe'), 'submit', null, _m('Subscribe to this tag'));
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * List of a user's subscriptions
+ *
+ * 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 Social
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@status.net>
+ * @copyright 2008-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);
+}
+
+/**
+ * A list of the user's subscriptions
+ *
+ * @category Social
+ * @package StatusNet
+ * @author Evan Prodromou <evan@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/
+ */
+class TagSubsAction extends GalleryAction
+{
+ function title()
+ {
+ if ($this->page == 1) {
+ // TRANS: Header for subscriptions overview for a user (first page).
+ // TRANS: %s is a user nickname.
+ return sprintf(_m('%s\'s tag subscriptions'), $this->user->nickname);
+ } else {
+ // TRANS: Header for subscriptions overview for a user (not first page).
+ // TRANS: %1$s is a user nickname, %2$d is the page number.
+ return sprintf(_m('%1$s\'s tag subscriptions, page %2$d'),
+ $this->user->nickname,
+ $this->page);
+ }
+ }
+
+ function showPageNotice()
+ {
+ $user = common_current_user();
+ if ($user && ($user->id == $this->profile->id)) {
+ $this->element('p', null,
+ // TRANS: Page notice for page with an overview of all tag subscriptions
+ // TRANS: of the logged in user's own profile.
+ _m('You have subscribed to receive all notices on this site containing the following tags:'));
+ } else {
+ $this->element('p', null,
+ // TRANS: Page notice for page with an overview of all subscriptions of a user other
+ // TRANS: than the logged in user. %s is the user nickname.
+ sprintf(_m('%s has subscribed to receive all notices on this site containing the following tags:'),
+ $this->profile->nickname));
+ }
+ }
+
+ function showContent()
+ {
+ if (Event::handle('StartShowTagSubscriptionsContent', array($this))) {
+ parent::showContent();
+
+ $offset = ($this->page-1) * PROFILES_PER_PAGE;
+ $limit = PROFILES_PER_PAGE + 1;
+
+ $cnt = 0;
+
+ $tagsub = new TagSub();
+ $tagsub->profile_id = $this->user->id;
+ $tagsub->limit($limit, $offset);
+ $tagsub->find();
+
+ if ($tagsub->N) {
+ $list = new TagSubscriptionsList($tagsub, $this->user, $this);
+ $cnt = $list->show();
+ if (0 == $cnt) {
+ $this->showEmptyListMessage();
+ }
+ } else {
+ $this->showEmptyListMessage();
+ }
+
+ $this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE,
+ $this->page, 'tagsubs',
+ array('nickname' => $this->user->nickname));
+
+
+ Event::handle('EndShowTagSubscriptionsContent', array($this));
+ }
+ }
+
+ function showEmptyListMessage()
+ {
+ if (common_logged_in()) {
+ $current_user = common_current_user();
+ if ($this->user->id === $current_user->id) {
+ // TRANS: Tag subscription list text when the logged in user has no tag subscriptions.
+ $message = _('You\'re not listening to any hash tags right now. You can push the "Subscribe" button ' .
+ 'on any hashtag page to automatically receive any public messages on this site that use that ' .
+ 'tag, even if you\'re not subscribed to the poster.');
+ } else {
+ // TRANS: Tag subscription list text when looking at the subscriptions for a of a user other
+ // TRANS: than the logged in user that has no tag subscriptions. %s is the user nickname.
+ $message = sprintf(_('%s is not listening to any tags.'), $this->user->nickname);
+ }
+ }
+ else {
+ // TRANS: Subscription list text when looking at the subscriptions for a of a user that has none
+ // TRANS: as an anonymous user. %s is the user nickname.
+ $message = sprintf(_m('%s is not listening to any tags.'), $this->user->nickname);
+ }
+
+ $this->elementStart('div', 'guide');
+ $this->raw(common_markup_to_html($message));
+ $this->elementEnd('div');
+ }
+}
+
+// XXX SubscriptionsList and SubscriptionList are dangerously close
+
+class TagSubscriptionsList extends SubscriptionList
+{
+ function newListItem($tagsub)
+ {
+ return new TagSubscriptionsListItem($tagsub, $this->owner, $this->action);
+ }
+}
+
+class TagSubscriptionsListItem extends SubscriptionListItem
+{
+ function startItem()
+ {
+ $this->out->elementStart('li', array('class' => 'tagsub'));
+ }
+
+ function showProfile()
+ {
+ $tagsub = $this->profile;
+ $tag = $tagsub->tag;
+
+ // Relevant portion!
+ $cur = common_current_user();
+ if (!empty($cur) && $cur->id == $this->owner->id) {
+ $this->showOwnerControls();
+ }
+
+ $url = common_local_url('tag', array('tag' => $tag));
+ $linkline = sprintf(_m('#<a href="%s">%s</a> since %s'),
+ htmlspecialchars($url),
+ htmlspecialchars($tag),
+ common_date_string($tagsub->created));
+
+ $this->out->elementStart('div', 'tagsub-item');
+ $this->out->raw($linkline);
+ $this->out->element('div', array('style' => 'clear: both'));
+ $this->out->elementEnd('div');
+ }
+
+ function showActions()
+ {
+ }
+
+ function showOwnerControls()
+ {
+ $this->out->elementStart('div', 'entity_actions');
+
+ $tagsub = $this->profile; // ?
+ $form = new TagUnsubForm($this->out, $tagsub->tag);
+ $form->show();
+
+ $this->out->elementEnd('div');
+ return;
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2008-2011, StatusNet, Inc.
+ *
+ * Tag subscription action.
+ *
+ * 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/>.
+ *
+ * PHP version 5
+ *
+ * @category Action
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2008-2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+/**
+ * Tag unsubscription action
+ *
+ * Takes parameters:
+ *
+ * - token: session token to prevent CSRF attacks
+ * - ajax: boolean; whether to return Ajax or full-browser results
+ *
+ * Only works if the current user is logged in.
+ *
+ * @category Action
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @author Brion Vibber <brion@status.net>
+ * @copyright 2008-2011 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
+ * @link http://status.net/
+ */
+class TagunsubAction extends TagsubAction
+{
+ /**
+ * Handle request
+ *
+ * Does the subscription and returns results.
+ *
+ * @param Array $args unused.
+ *
+ * @return void
+ */
+ function handle($args)
+ {
+ // Throws exception on error
+
+ TagSub::cancel($this->user->getProfile(),
+ $this->tag);
+
+ if ($this->boolean('ajax')) {
+ $this->startHTML('text/xml;charset=utf-8');
+ $this->elementStart('head');
+ // TRANS: Page title when tag unsubscription succeeded.
+ $this->element('title', null, _m('Unsubscribed'));
+ $this->elementEnd('head');
+ $this->elementStart('body');
+ $subscribe = new TagSubForm($this, $this->tag);
+ $subscribe->show();
+ $this->elementEnd('body');
+ $this->elementEnd('html');
+ } else {
+ $url = common_local_url('tag',
+ array('tag' => $this->tag));
+ common_redirect($url, 303);
+ }
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Form for subscribing to a 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 TagSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@status.net>
+ * @copyright 2009-2011 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);
+}
+
+/**
+ * Form for subscribing to a user
+ *
+ * @category TagSubPlugin
+ * @package StatusNet
+ * @author Brion Vibber <brion@status.net>
+ * @author Evan Prodromou <evan@status.net>
+ * @author Sarven Capadisli <csarven@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 UnsubscribeForm
+ */
+
+class TagUnsubForm extends TagSubForm
+{
+ /**
+ * ID of the form
+ *
+ * @return int ID of the form
+ */
+
+ function id()
+ {
+ return 'tag-unsubscribe-' . $this->tag;
+ }
+
+
+ /**
+ * class of the form
+ *
+ * @return string of the form class
+ */
+
+ function formClass()
+ {
+ // class to match existing styles...
+ return 'form_user_unsubscribe ajax';
+ }
+
+
+ /**
+ * Action of the form
+ *
+ * @return string URL of the action
+ */
+
+ function action()
+ {
+ return common_local_url('tagunsub', array('tag' => $this->tag));
+ }
+
+
+ /**
+ * Legend of the Form
+ *
+ * @return void
+ */
+ function formLegend()
+ {
+ $this->out->element('legend', null, _m('Unsubscribe from this tag'));
+ }
+
+ /**
+ * Action elements
+ *
+ * @return void
+ */
+
+ function formActions()
+ {
+ $this->out->submit('submit', _('Unsubscribe'), 'submit', null, _m('Unsubscribe from this tag'));
+ }
+}
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgstr ""
#. TRANS: Plugin description.
-#: UserFlagPlugin.php:294
+#: UserFlagPlugin.php:279
msgid ""
"This plugin allows flagging of profiles for review and reviewing flagged "
"profiles."
--- /dev/null
+# Translation of StatusNet - UserFlag to German (Deutsch)
+# Exported from translatewiki.net
+#
+# Author: Habi
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - UserFlag\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:19:37+0000\n"
+"Language-Team: German <http://translatewiki.net/wiki/Portal:de>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-06 02:19:38+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: de\n"
+"X-Message-Group: #out-statusnet-plugin-userflag\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. TRANS: AJAX form title for a flagged profile.
+msgid "Flagged for review"
+msgstr "Zum Überprüfen markiert"
+
+#. TRANS: Body text for AJAX form when a profile has been flagged for review.
+#. TRANS: Message added to a profile if it has been flagged for review.
+msgid "Flagged"
+msgstr "Markiert"
+
+#. TRANS: Plugin description.
+msgid ""
+"This plugin allows flagging of profiles for review and reviewing flagged "
+"profiles."
+msgstr ""
+"Dieser Plugin ermöglicht, Profile zur Überprüfung zu markieren und diese "
+"markierten Profile zu überprüfen."
+
+#. TRANS: Form title for flagging a profile for review.
+msgid "Flag"
+msgstr "Markieren"
+
+#. TRANS: Form description.
+msgid "Flag profile for review."
+msgstr "Profil zur Überprüfung markieren."
+
+#. TRANS: Form title for action on a profile.
+msgid "Clear"
+msgstr "Löschen"
+
+msgid "Clear all flags"
+msgstr "Alle Markierungen löschen"
+
+#. TRANS: Title for page with a list of profiles that were flagged for review.
+msgid "Flagged profiles"
+msgstr "Markierte Profile"
+
+#. TRANS: Header for moderation menu with action buttons for flagged profiles (like 'sandbox', 'silence', ...).
+msgid "Moderate"
+msgstr "Moderieren"
+
+#. TRANS: Message displayed on a profile if it has been flagged.
+#. TRANS: %1$s is a comma separated list of at most 5 user nicknames that flagged.
+#. TRANS: %2$d is a positive integer of additional flagging users. Also used for the plural.
+#, php-format
+msgid "Flagged by %1$s and %2$d other"
+msgid_plural "Flagged by %1$s and %2$d others"
+msgstr[0] "Markiert durch %1$s und %2$d weitere Konten"
+msgstr[1] "Markiert durch %1$s und %2$d Andere"
+
+#. TRANS: Message displayed on a profile if it has been flagged.
+#. TRANS: %s is a comma separated list of at most 5 user nicknames that flagged.
+#, php-format
+msgid "Flagged by %s"
+msgstr "Durch %s markiert"
+
+#. TRANS: Server exception given when flags could not be cleared.
+#, php-format
+msgid "Couldn't clear flags for profile \"%s\"."
+msgstr "Konnte Markierung für Profil \"%s\" nicht entfernen."
+
+#. TRANS: Title for AJAX form to indicated that flags were removed.
+msgid "Flags cleared"
+msgstr ""
+
+#. TRANS: Body element for "flags cleared" form.
+msgid "Cleared"
+msgstr ""
+
+#. TRANS: Server exception.
+#, php-format
+msgid "Couldn't flag profile \"%d\" for review."
+msgstr ""
--- /dev/null
+# Translation of StatusNet - UserLimit to Persian (فارسی)
+# Exported from translatewiki.net
+#
+# Author: Ebraminio
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - UserLimit\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:52:14+0000\n"
+"Language-Team: Persian <http://translatewiki.net/wiki/Portal:fa>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-06 02:19:38+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: fa\n"
+"X-Message-Group: #out-statusnet-plugin-userlimit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgid "Limit the number of users who can register."
+msgstr "محدودکردن تعداد کاربرانی که میتوانید ثبت نام کنند."
--- /dev/null
+# Translation of StatusNet - Xmpp to Swedish (Svenska)
+# Exported from translatewiki.net
+#
+# Author: WikiPhoenix
+# --
+# This file is distributed under the same license as the StatusNet package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: StatusNet - Xmpp\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-03-11 18:15+0000\n"
+"PO-Revision-Date: 2011-03-11 18:19:44+0000\n"
+"Language-Team: Swedish <http://translatewiki.net/wiki/Portal:sv>\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POT-Import-Date: 2011-03-08 01:22:14+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
+"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
+"X-Language-Code: sv\n"
+"X-Message-Group: #out-statusnet-plugin-xmpp\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+msgid "Send me a message to post a notice"
+msgstr ""
+
+msgid "XMPP/Jabber/GTalk"
+msgstr "XMPP/Jabber/GTalk"
+
+msgid ""
+"The XMPP plugin allows users to send and receive notices over the XMPP/"
+"Jabber network."
+msgstr ""
+"XMPP-tillägget tillåter användare skicka och ta emot meddelanden över XMPP/"
+"Jabber-nätverket."
msgstr ""
"Project-Id-Version: StatusNet - YammerImport\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-03-06 02:34+0100\n"
-"PO-Revision-Date: 2011-03-06 01:38:37+0000\n"
+"POT-Creation-Date: 2011-03-17 09:47+0000\n"
+"PO-Revision-Date: 2011-03-17 09:52:24+0000\n"
"Language-Team: Russian <http://translatewiki.net/wiki/Portal:ru>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-POT-Import-Date: 2011-03-03 17:47:55+0000\n"
-"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
+"X-POT-Import-Date: 2011-03-06 02:19:42+0000\n"
+"X-Generator: MediaWiki 1.18alpha (r84120); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ru\n"
"X-Message-Group: #out-statusnet-plugin-yammerimport\n"
msgid "Import user groups"
msgstr "Импорт групп пользователей"
-#, php-format
+#, fuzzy, php-format
msgid "Importing %d group..."
msgid_plural "Importing %d groups..."
msgstr[0] "Импорт %d группы…"
msgstr[1] "Импорт %d группы…"
-msgstr[2] ""
+msgstr[2] "Импорт %d группы…"
#, php-format
msgid "Imported %d group."
require_once INSTALLDIR.'/scripts/commandline.inc';
-Cache::delete(Router::cacheKey());
+$cache = Cache::instance();
+$cache->delete(Router::cacheKey());
print "OK.\n";
\ No newline at end of file
a {color: #3e3e8c;}
a:hover {color: blue;}
+abbr {border-bottom: none;}
+
h1 {font-size: 1.6em;}
h2 {font-size: 1.6em;}
h3 {font-size: 1.4em;}
#core {
clear: both;
margin: 0px;
- width: 960px;
+ width: 958px;
border-top: 5px solid #FB6104;
+ border-left: 1px solid #d8dae6;
+ border-right: 1px solid #d8dae6;
}
-#site_nav_local_views {
- display: block;
+#aside_primary_wrapper {
+ width: 100%;
+ float: left;
+ overflow: hidden;
+ position: relative;
+ background-color: #ececf2;
+}
+
+#content_wrapper {
+ width: 100%;
+ float: left;
+ position: relative;
+ right: 239px;
+ background-color: #fff;
+ border-right: 1px solid #d8dae6;
+}
+
+#site_nav_local_views_wrapper {
+ width: 100%;
float: left;
+ position: relative;
+ right: 561px;
+ background-color: #ececf2;
+ border-right: 1px solid #d8dae6;
+}
+
+#site_nav_local_views {
width: 138px;
+ float: left;
+ overflow: hidden;
+ position: relative;
+ left: 800px;
margin-top: 0px;
- padding: 10px;
- padding-top: 22px;
- background-color: #ececf2;
- border-left: 1px solid #d8dae6;
- border-right: 1px solid #d8dae6;
- min-height: 800px; /* XXX set up equal column heights! */
+ padding: 22px 10px 40px 10px;
}
#site_nav_local_views H3 {
#content {
width: 520px;
- margin-right: 0px;
- padding: 20px;
+ float: left;
+ overflow: hidden;
+ position: relative;
+ left: 801px;
+ margin: 0px;
+ padding: 20px 20px 40px 20px;
}
/* Input forms */
display: none; /* XXX move into input with js */
}
-.form_notice textarea,
.form_notice_placeholder .placeholder {
width: 473px;
+ padding: 4px 10px 4px 10px;
+ border: 1px solid #a6a6a6;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
+ z-index: 97;
+ font-size: 1em;
+}
+
+.form_notice textarea {
+ width: 473px;
+ height: 42px;
+ padding: 6px 10px 18px 10px;
+ border: 1px solid #a6a6a6;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2);
+ z-index: 97;
+ font-size: 1.2em;
}
+
+
.form_notice textarea {
height: 42px;
padding: 6px 10px 18px 10px;
float: none;
clear: none;
margin-left: 0px;
- margin-top: 5px;
+ margin-top: 10px;
padding: 5px 5px 5px 10px;
border: 1px solid #ccc;
}
#aside_primary {
width: 218px;
- padding: 10px;
- padding-top: 22px;
+ float: left;
+ overflow: hidden;
+ position: relative;
+ left: 802px;
+ padding: 22px 10px 40px 10px;
margin-top: 0px;
- background-color: #ececf2;
- border-left: 1px solid #d8dae6;
- border-right: 1px solid #d8dae6;
- min-height: 800px; /* XXX set up equal column heights! */
+ background: none;
}
#aside_primary .section {
text-transform: uppercase;
}
+.profile_block_name {
+ font-size: 14px;
+ font-weight: bold;
+}
+
+.profile_block_location {
+ font-weight: bold;
+}
+
+.profile_block_description {
+ line-height: 1.2em;
+}
+
+.profile_block .entity_actions {
+ float: left;
+ margin-left: 0px;
+}
+
+.profile_block .entity_moderation:hover ul,
+.profile_block .entity_role:hover ul {
+ left: 20px;
+}
+
+.profile_block a.profiledetail {
+ display: block;
+}
+
.section ul.entities {
- width: 220px;
+ width: 240px;
}
.section .entities li {
- margin-right: 17px;
- margin-bottom: 10px;
+ margin-right: 23px;
+ margin-bottom: 12px;
width: 24px;
}
}
#content .notice .threaded-replies .notice {
+ width: 440px;
+ min-height: 1px;
padding-bottom: 14px;
padding-top: 5px;
border-bottom: 2px dotted #eee;
clear:left;
float:left;
margin-left: 35px;
- margin-top: 10px;
+ margin-top: 4px !important;
}
.threaded-replies li {
width: 390px;
}
+#content .notice .notice {
+ width: 100%;
+ margin-left: 0;
+ margin-top: 16px;
+ margin-bottom: 10px;
+}
+
+.notice .notice {
+background-color:rgba(200, 200, 200, 0.050);
+}
+.notice .notice .notice {
+background-color:rgba(200, 200, 200, 0.100);
+}
+.notice .notice .notice .notice {
+background-color:rgba(200, 200, 200, 0.150);
+}
+.notice .notice .notice .notice .notice {
+background-color:rgba(200, 200, 200, 0.300);
+}
+
.pagination {
height: 1.2em;
}
}
#footer {
+ position: relative;
+ top: -6px;
color: #000;
margin-left: 0px;
margin-right: 0px;
padding-left: 4px !important;
padding-right: 4px !important;
margin-right: 0px;
+ left: 0;
+ right: 0;
+ width: 400px;
+ overflow: visible;
+}
+
+.realtime-popup .threaded-replies {
+ margin-left: 10px;
+}
+
+.realtime-popup .input_forms {
+ display: none; /* XXX fixme! */
}
.realtime-popup .form_notice textarea {
background: #f2f2f2;
color: #3e3e8c !important;
text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.5);
- font-size: 0.9em;
+ font-size: 0.88em;
}
ul.bookmark-tags a:hover {
}
.bookmark div.entry-content {
- font-size: 0.9em;
+ font-size: 0.88em;
line-height: 1.2em;
margin-top: 6px;
opacity: 0.6;
/* Onboard specific styles */
.onboard-flash {
+ position: relative;
+ right: -800px;
+ top: 10px;
border-radius: 6px;
-moz-border-radius: 6px;
-webkit-border-radius: 6px;
font-size: 0em;
}
+/* Event specific styles */
+
+.notice .vevent div {
+ margin-bottom: 8px;
+}
+
+.event-info {
+ margin-left: 0px !important;
+ margin-top: 2px !important;
+}
+
+.notice .event-info + .notice-options {
+ margin-top: 14px;
+}
+
+.notice .threaded-replies .event-info + .notice-options {
+ margin-top: 20px;
+}
+
+#form_event_rsvp #new_rsvp_data {
+ display: inline;
+ margin: 10px 0px;
+}
+
+#form_event_rsvp input.submit {
+ height: auto;
+ padding: 0px 10px;
+ margin-left: 10px;
+ color:#fff;
+ font-weight: bold;
+ text-transform: uppercase;
+ font-size: 1.1em;
+ text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2);
+ border: 1px solid #d7621c;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ background: #FB6104;
+ background: -moz-linear-gradient(top, #ff9d63 , #FB6104);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ff9d63), color-stop(100%,#FB6104));
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff9d63', endColorstr='#FB6104',GradientType=0 );
+}
+
+#form_event_rsvp .notice input.submit:hover {
+ text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.6);
+ background: #ff9d63;
+ background: -moz-linear-gradient(top, #FB6104 , #fc8035);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#FB6104), color-stop(100%,#fc8035));
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FB6104', endColorstr='#fc8035',GradientType=0 );
+}
}/*end of @media screen, projection, tv*/
overflow:visible;
}
+.notice .automatic {
+font-style:italic;
+}
+
#showstream h1 {
display:none;
}