Merge branch 'dev/0.8.x' into 0.8.x
							
								
								
									
										3
									
								
								README
									
									
									
									
									
								
							
							
						
						| @@ -1133,6 +1133,9 @@ welcome: nickname of a user account that sends welcome messages to new | ||||
|          busy servers it may be a good idea to keep that one just for | ||||
|          'urgent' messages. Default is null; no message. | ||||
|  | ||||
| If either of these special user accounts are specified, the users should | ||||
| be created before the configuration is updated. | ||||
|  | ||||
| Troubleshooting | ||||
| =============== | ||||
|  | ||||
|   | ||||
| @@ -191,11 +191,28 @@ class FinishopenidloginAction extends Action | ||||
|     { | ||||
|         # FIXME: save invite code before redirect, and check here | ||||
|  | ||||
|         if (common_config('site', 'closed') || common_config('site', 'inviteonly')) { | ||||
|         if (common_config('site', 'closed')) { | ||||
|             $this->clientError(_('Registration not allowed.')); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $invite = null; | ||||
|  | ||||
|         if (common_config('site', 'inviteonly')) { | ||||
|             $code = $_SESSION['invitecode']; | ||||
|             if (empty($code)) { | ||||
|                 $this->clientError(_('Registration not allowed.')); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             $invite = Invitation::staticGet($code); | ||||
|  | ||||
|             if (empty($invite)) { | ||||
|                 $this->clientError(_('Not a valid invitation code.')); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $nickname = $this->trimmed('newname'); | ||||
|  | ||||
|         if (!Validate::string($nickname, array('min_length' => 1, | ||||
| @@ -257,10 +274,16 @@ class FinishopenidloginAction extends Action | ||||
|         # XXX: add language | ||||
|         # XXX: add timezone | ||||
|  | ||||
|         $user = User::register(array('nickname' => $nickname, | ||||
|                                      'email' => $email, | ||||
|                                      'fullname' => $fullname, | ||||
|                                      'location' => $location)); | ||||
|         $args = array('nickname' => $nickname, | ||||
|                       'email' => $email, | ||||
|                       'fullname' => $fullname, | ||||
|                       'location' => $location); | ||||
|  | ||||
|         if (!empty($invite)) { | ||||
|             $args['code'] = $invite->code; | ||||
|         } | ||||
|  | ||||
|         $user = User::register($args); | ||||
|  | ||||
|         $result = oid_link_user($user->id, $canonical, $display); | ||||
|  | ||||
|   | ||||
| @@ -34,7 +34,7 @@ if (!defined('LACONICA')) { | ||||
|  | ||||
| require_once INSTALLDIR.'/lib/rssaction.php'; | ||||
|  | ||||
| define('MEMBERS_PER_SECTION', 81); | ||||
| define('MEMBERS_PER_SECTION', 27); | ||||
|  | ||||
| /** | ||||
|  * Group RSS feed | ||||
|   | ||||
| @@ -91,67 +91,68 @@ class ProfilesettingsAction extends AccountSettingsAction | ||||
|         $this->element('legend', null, _('Profile information')); | ||||
|         $this->hidden('token', common_session_token()); | ||||
|  | ||||
|         # too much common patterns here... abstractable? | ||||
|  | ||||
|         // too much common patterns here... abstractable? | ||||
|         $this->elementStart('ul', 'form_data'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->input('nickname', _('Nickname'), | ||||
|                      ($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname, | ||||
|                      _('1-64 lowercase letters or numbers, no punctuation or spaces')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->input('fullname', _('Full name'), | ||||
|                      ($this->arg('fullname')) ? $this->arg('fullname') : $profile->fullname); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->input('homepage', _('Homepage'), | ||||
|                      ($this->arg('homepage')) ? $this->arg('homepage') : $profile->homepage, | ||||
|                      _('URL of your homepage, blog, or profile on another site')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->textarea('bio', _('Bio'), | ||||
|                         ($this->arg('bio')) ? $this->arg('bio') : $profile->bio, | ||||
|                         _('Describe yourself and your interests in 140 chars')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->input('location', _('Location'), | ||||
|                      ($this->arg('location')) ? $this->arg('location') : $profile->location, | ||||
|                      _('Where you are, like "City, State (or Region), Country"')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->input('tags', _('Tags'), | ||||
|                      ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()), | ||||
|                      _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $language = common_language(); | ||||
|         $this->dropdown('language', _('Language'), | ||||
|                         get_nice_language_list(), _('Preferred language'), | ||||
|                         true, $language); | ||||
|         $this->elementEnd('li'); | ||||
|         $timezone = common_timezone(); | ||||
|         $timezones = array(); | ||||
|         foreach(DateTimeZone::listIdentifiers() as $k => $v) { | ||||
|             $timezones[$v] = $v; | ||||
|         if (Event::handle('StartProfileFormData', array($this))) { | ||||
|             $this->elementStart('li'); | ||||
|             $this->input('nickname', _('Nickname'), | ||||
|                          ($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname, | ||||
|                          _('1-64 lowercase letters or numbers, no punctuation or spaces')); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $this->input('fullname', _('Full name'), | ||||
|                          ($this->arg('fullname')) ? $this->arg('fullname') : $profile->fullname); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $this->input('homepage', _('Homepage'), | ||||
|                          ($this->arg('homepage')) ? $this->arg('homepage') : $profile->homepage, | ||||
|                          _('URL of your homepage, blog, or profile on another site')); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $this->textarea('bio', _('Bio'), | ||||
|                             ($this->arg('bio')) ? $this->arg('bio') : $profile->bio, | ||||
|                             _('Describe yourself and your interests in 140 chars')); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $this->input('location', _('Location'), | ||||
|                          ($this->arg('location')) ? $this->arg('location') : $profile->location, | ||||
|                          _('Where you are, like "City, State (or Region), Country"')); | ||||
|             $this->elementEnd('li'); | ||||
|             Event::handle('EndProfileFormData', array($this)); | ||||
|             $this->elementStart('li'); | ||||
|             $this->input('tags', _('Tags'), | ||||
|                          ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()), | ||||
|                          _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated')); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $language = common_language(); | ||||
|             $this->dropdown('language', _('Language'), | ||||
|                             get_nice_language_list(), _('Preferred language'), | ||||
|                             false, $language); | ||||
|             $this->elementEnd('li'); | ||||
|             $timezone = common_timezone(); | ||||
|             $timezones = array(); | ||||
|             foreach(DateTimeZone::listIdentifiers() as $k => $v) { | ||||
|                 $timezones[$v] = $v; | ||||
|             } | ||||
|             $this->elementStart('li'); | ||||
|             $this->dropdown('timezone', _('Timezone'), | ||||
|                             $timezones, _('What timezone are you normally in?'), | ||||
|                             true, $timezone); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $this->checkbox('autosubscribe', | ||||
|                             _('Automatically subscribe to whoever '. | ||||
|                               'subscribes to me (best for non-humans)'), | ||||
|                             ($this->arg('autosubscribe')) ? | ||||
|                             $this->boolean('autosubscribe') : $user->autosubscribe); | ||||
|             $this->elementEnd('li'); | ||||
|         } | ||||
|         $this->elementStart('li'); | ||||
|         $this->dropdown('timezone', _('Timezone'), | ||||
|                         $timezones, _('What timezone are you normally in?'), | ||||
|                         true, $timezone); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->checkbox('autosubscribe', | ||||
|                         _('Automatically subscribe to whoever '. | ||||
|                           'subscribes to me (best for non-humans)'), | ||||
|                         ($this->arg('autosubscribe')) ? | ||||
|                         $this->boolean('autosubscribe') : $user->autosubscribe); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementEnd('ul'); | ||||
|         $this->submit('save', _('Save')); | ||||
|  | ||||
|         $this->elementEnd('fieldset'); | ||||
|         $this->elementEnd('form'); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -165,158 +166,158 @@ class ProfilesettingsAction extends AccountSettingsAction | ||||
|  | ||||
|     function handlePost() | ||||
|     { | ||||
|         # CSRF protection | ||||
|  | ||||
|         // CSRF protection | ||||
|         $token = $this->trimmed('token'); | ||||
|         if (!$token || $token != common_session_token()) { | ||||
|             $this->showForm(_('There was a problem with your session token. '. | ||||
|                                'Try again, please.')); | ||||
|                         'Try again, please.')); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $nickname = $this->trimmed('nickname'); | ||||
|         $fullname = $this->trimmed('fullname'); | ||||
|         $homepage = $this->trimmed('homepage'); | ||||
|         $bio = $this->trimmed('bio'); | ||||
|         $location = $this->trimmed('location'); | ||||
|         $autosubscribe = $this->boolean('autosubscribe'); | ||||
|         $language = $this->trimmed('language'); | ||||
|         $timezone = $this->trimmed('timezone'); | ||||
|         $tagstring = $this->trimmed('tags'); | ||||
|         if (Event::handle('StartProfileSaveForm', array($this))) { | ||||
|  | ||||
|         # Some validation | ||||
|             $nickname = $this->trimmed('nickname'); | ||||
|             $fullname = $this->trimmed('fullname'); | ||||
|             $homepage = $this->trimmed('homepage'); | ||||
|             $bio = $this->trimmed('bio'); | ||||
|             $location = $this->trimmed('location'); | ||||
|             $autosubscribe = $this->boolean('autosubscribe'); | ||||
|             $language = $this->trimmed('language'); | ||||
|             $timezone = $this->trimmed('timezone'); | ||||
|             $tagstring = $this->trimmed('tags'); | ||||
|  | ||||
|         if (!Validate::string($nickname, array('min_length' => 1, | ||||
|                                                'max_length' => 64, | ||||
|                                                'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { | ||||
|             $this->showForm(_('Nickname must have only lowercase letters and numbers and no spaces.')); | ||||
|             return; | ||||
|         } else if (!User::allowed_nickname($nickname)) { | ||||
|             $this->showForm(_('Not a valid nickname.')); | ||||
|             return; | ||||
|         } else if (!is_null($homepage) && (strlen($homepage) > 0) && | ||||
|                    !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) { | ||||
|             $this->showForm(_('Homepage is not a valid URL.')); | ||||
|             return; | ||||
|         } else if (!is_null($fullname) && mb_strlen($fullname) > 255) { | ||||
|             $this->showForm(_('Full name is too long (max 255 chars).')); | ||||
|             return; | ||||
|         } else if (!is_null($bio) && mb_strlen($bio) > 140) { | ||||
|             $this->showForm(_('Bio is too long (max 140 chars).')); | ||||
|             return; | ||||
|         } else if (!is_null($location) && mb_strlen($location) > 255) { | ||||
|             $this->showForm(_('Location is too long (max 255 chars).')); | ||||
|             return; | ||||
|         }  else if (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) { | ||||
|             $this->showForm(_('Timezone not selected.')); | ||||
|             return; | ||||
|         } else if ($this->nicknameExists($nickname)) { | ||||
|             $this->showForm(_('Nickname already in use. Try another one.')); | ||||
|             return; | ||||
|         } else if (!is_null($language) && strlen($language) > 50) { | ||||
|             $this->showForm(_('Language is too long (max 50 chars).')); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         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)) { | ||||
|                 $this->showForm(sprintf(_('Invalid tag: "%s"'), $tag)); | ||||
|             // Some validation | ||||
|             if (!Validate::string($nickname, array('min_length' => 1, | ||||
|                             'max_length' => 64, | ||||
|                             'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) { | ||||
|                 $this->showForm(_('Nickname must have only lowercase letters and numbers and no spaces.')); | ||||
|                 return; | ||||
|             } else if (!User::allowed_nickname($nickname)) { | ||||
|                 $this->showForm(_('Not a valid nickname.')); | ||||
|                 return; | ||||
|             } else if (!is_null($homepage) && (strlen($homepage) > 0) && | ||||
|                     !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) { | ||||
|                 $this->showForm(_('Homepage is not a valid URL.')); | ||||
|                 return; | ||||
|             } else if (!is_null($fullname) && mb_strlen($fullname) > 255) { | ||||
|                 $this->showForm(_('Full name is too long (max 255 chars).')); | ||||
|                 return; | ||||
|             } else if (!is_null($bio) && mb_strlen($bio) > 140) { | ||||
|                 $this->showForm(_('Bio is too long (max 140 chars).')); | ||||
|                 return; | ||||
|             } else if (!is_null($location) && mb_strlen($location) > 255) { | ||||
|                 $this->showForm(_('Location is too long (max 255 chars).')); | ||||
|                 return; | ||||
|             }  else if (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) { | ||||
|                 $this->showForm(_('Timezone not selected.')); | ||||
|                 return; | ||||
|             } else if ($this->nicknameExists($nickname)) { | ||||
|                 $this->showForm(_('Nickname already in use. Try another one.')); | ||||
|                 return; | ||||
|             } else if (!is_null($language) && strlen($language) > 50) { | ||||
|                 $this->showForm(_('Language is too long (max 50 chars).')); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $user = common_current_user(); | ||||
|  | ||||
|         $user->query('BEGIN'); | ||||
|  | ||||
|         if ($user->nickname != $nickname || | ||||
|             $user->language != $language || | ||||
|             $user->timezone != $timezone) { | ||||
|  | ||||
|             common_debug('Updating user nickname from ' . $user->nickname . ' to ' . $nickname, | ||||
|                          __FILE__); | ||||
|             common_debug('Updating user language from ' . $user->language . ' to ' . $language, | ||||
|                          __FILE__); | ||||
|             common_debug('Updating user timezone from ' . $user->timezone . ' to ' . $timezone, | ||||
|                          __FILE__); | ||||
|  | ||||
|             $original = clone($user); | ||||
|  | ||||
|             $user->nickname = $nickname; | ||||
|             $user->language = $language; | ||||
|             $user->timezone = $timezone; | ||||
|  | ||||
|             $result = $user->updateKeys($original); | ||||
|  | ||||
|             if ($result === false) { | ||||
|                 common_log_db_error($user, 'UPDATE', __FILE__); | ||||
|                 $this->serverError(_('Couldn\'t update user.')); | ||||
|                 return; | ||||
|             if ($tagstring) { | ||||
|                 $tags = array_map('common_canonical_tag', preg_split('/[\s,]+/', $tagstring)); | ||||
|             } else { | ||||
|                 # Re-initialize language environment if it changed | ||||
|                 common_init_language(); | ||||
|                 $tags = array(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         # XXX: XOR | ||||
|             foreach ($tags as $tag) { | ||||
|                 if (!common_valid_profile_tag($tag)) { | ||||
|                     $this->showForm(sprintf(_('Invalid tag: "%s"'), $tag)); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|         if ($user->autosubscribe ^ $autosubscribe) { | ||||
|             $user = common_current_user(); | ||||
|  | ||||
|             $original = clone($user); | ||||
|             $user->query('BEGIN'); | ||||
|  | ||||
|             $user->autosubscribe = $autosubscribe; | ||||
|             if ($user->nickname != $nickname || | ||||
|                     $user->language != $language || | ||||
|                     $user->timezone != $timezone) { | ||||
|  | ||||
|             $result = $user->update($original); | ||||
|                 common_debug('Updating user nickname from ' . $user->nickname . ' to ' . $nickname, | ||||
|                         __FILE__); | ||||
|                 common_debug('Updating user language from ' . $user->language . ' to ' . $language, | ||||
|                         __FILE__); | ||||
|                 common_debug('Updating user timezone from ' . $user->timezone . ' to ' . $timezone, | ||||
|                         __FILE__); | ||||
|  | ||||
|             if ($result === false) { | ||||
|                 common_log_db_error($user, 'UPDATE', __FILE__); | ||||
|                 $this->serverError(_('Couldn\'t update user for autosubscribe.')); | ||||
|                 $original = clone($user); | ||||
|  | ||||
|                 $user->nickname = $nickname; | ||||
|                 $user->language = $language; | ||||
|                 $user->timezone = $timezone; | ||||
|  | ||||
|                 $result = $user->updateKeys($original); | ||||
|  | ||||
|                 if ($result === false) { | ||||
|                     common_log_db_error($user, 'UPDATE', __FILE__); | ||||
|                     $this->serverError(_('Couldn\'t update user.')); | ||||
|                     return; | ||||
|                 } else { | ||||
|                     // Re-initialize language environment if it changed | ||||
|                     common_init_language(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| // XXX: XOR | ||||
|             if ($user->autosubscribe ^ $autosubscribe) { | ||||
|  | ||||
|                 $original = clone($user); | ||||
|  | ||||
|                 $user->autosubscribe = $autosubscribe; | ||||
|  | ||||
|                 $result = $user->update($original); | ||||
|  | ||||
|                 if ($result === false) { | ||||
|                     common_log_db_error($user, 'UPDATE', __FILE__); | ||||
|                     $this->serverError(_('Couldn\'t update user for autosubscribe.')); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             $profile = $user->getProfile(); | ||||
|  | ||||
|             $orig_profile = clone($profile); | ||||
|  | ||||
|             $profile->nickname = $user->nickname; | ||||
|             $profile->fullname = $fullname; | ||||
|             $profile->homepage = $homepage; | ||||
|             $profile->bio = $bio; | ||||
|             $profile->location = $location; | ||||
|             $profile->profileurl = common_profile_url($nickname); | ||||
|  | ||||
|             common_debug('Old profile: ' . common_log_objstring($orig_profile), __FILE__); | ||||
|             common_debug('New profile: ' . common_log_objstring($profile), __FILE__); | ||||
|  | ||||
|             $result = $profile->update($orig_profile); | ||||
|  | ||||
|             if (!$result) { | ||||
|                 common_log_db_error($profile, 'UPDATE', __FILE__); | ||||
|                 $this->serverError(_('Couldn\'t save profile.')); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             // Set the user tags | ||||
|             $result = $user->setSelfTags($tags); | ||||
|  | ||||
|             if (!$result) { | ||||
|                 $this->serverError(_('Couldn\'t save tags.')); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             $user->query('COMMIT'); | ||||
|             Event::handle('EndProfileSaveForm', array($this)); | ||||
|             common_broadcast_profile($profile); | ||||
|  | ||||
|             $this->showForm(_('Settings saved.'), true); | ||||
|  | ||||
|         } | ||||
|  | ||||
|         $profile = $user->getProfile(); | ||||
|  | ||||
|         $orig_profile = clone($profile); | ||||
|  | ||||
|         $profile->nickname = $user->nickname; | ||||
|         $profile->fullname = $fullname; | ||||
|         $profile->homepage = $homepage; | ||||
|         $profile->bio = $bio; | ||||
|         $profile->location = $location; | ||||
|         $profile->profileurl = common_profile_url($nickname); | ||||
|  | ||||
|         common_debug('Old profile: ' . common_log_objstring($orig_profile), __FILE__); | ||||
|         common_debug('New profile: ' . common_log_objstring($profile), __FILE__); | ||||
|  | ||||
|         $result = $profile->update($orig_profile); | ||||
|  | ||||
|         if (!$result) { | ||||
|             common_log_db_error($profile, 'UPDATE', __FILE__); | ||||
|             $this->serverError(_('Couldn\'t save profile.')); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         # Set the user tags | ||||
|  | ||||
|         $result = $user->setSelfTags($tags); | ||||
|  | ||||
|         if (!$result) { | ||||
|             $this->serverError(_('Couldn\'t save tags.')); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $user->query('COMMIT'); | ||||
|  | ||||
|         common_broadcast_profile($profile); | ||||
|  | ||||
|         $this->showForm(_('Settings saved.'), true); | ||||
|     } | ||||
|  | ||||
|     function nicknameExists($nickname) | ||||
|   | ||||
| @@ -55,6 +55,45 @@ class RegisterAction extends Action | ||||
|  | ||||
|     var $registered = false; | ||||
|  | ||||
|     /** | ||||
|      * Prepare page to run | ||||
|      * | ||||
|      * | ||||
|      * @param $args | ||||
|      * @return string title | ||||
|      */ | ||||
|  | ||||
|     function prepare($args) | ||||
|     { | ||||
|         parent::prepare($args); | ||||
|         $this->code = $this->trimmed('code'); | ||||
|  | ||||
|         if (empty($this->code)) { | ||||
|             common_ensure_session(); | ||||
|             if (array_key_exists('invitecode', $_SESSION)) { | ||||
|                 $this->code = $_SESSION['invitecode']; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (common_config('site', 'inviteonly') && empty($this->code)) { | ||||
|             $this->clientError(_('Sorry, only invited people can register.')); | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         if (!empty($this->code)) { | ||||
|             $this->invite = Invitation::staticGet('code', $this->code); | ||||
|             if (empty($this->invite)) { | ||||
|                 $this->clientError(_('Sorry, invalid invitation code.')); | ||||
|                 return false; | ||||
|             } | ||||
|             // Store this in case we need it | ||||
|             common_ensure_session(); | ||||
|             $_SESSION['invitecode'] = $this->code; | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Title of the page | ||||
|      * | ||||
| @@ -108,109 +147,109 @@ class RegisterAction extends Action | ||||
|  | ||||
|     function tryRegister() | ||||
|     { | ||||
|         $token = $this->trimmed('token'); | ||||
|         if (!$token || $token != common_session_token()) { | ||||
|             $this->showForm(_('There was a problem with your session token. '. | ||||
|                               'Try again, please.')); | ||||
|             return; | ||||
|         } | ||||
|         if (Event::handle('StartRegistrationTry', array($this))) { | ||||
|             $token = $this->trimmed('token'); | ||||
|             if (!$token || $token != common_session_token()) { | ||||
|                 $this->showForm(_('There was a problem with your session token. '. | ||||
|                                   'Try again, please.')); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|         $nickname = $this->trimmed('nickname'); | ||||
|         $email    = $this->trimmed('email'); | ||||
|         $fullname = $this->trimmed('fullname'); | ||||
|         $homepage = $this->trimmed('homepage'); | ||||
|         $bio      = $this->trimmed('bio'); | ||||
|         $location = $this->trimmed('location'); | ||||
|             $nickname = $this->trimmed('nickname'); | ||||
|             $email    = $this->trimmed('email'); | ||||
|             $fullname = $this->trimmed('fullname'); | ||||
|             $homepage = $this->trimmed('homepage'); | ||||
|             $bio      = $this->trimmed('bio'); | ||||
|             $location = $this->trimmed('location'); | ||||
|  | ||||
|         // We don't trim these... whitespace is OK in a password! | ||||
|             // We don't trim these... whitespace is OK in a password! | ||||
|             $password = $this->arg('password'); | ||||
|             $confirm  = $this->arg('confirm'); | ||||
|  | ||||
|         $password = $this->arg('password'); | ||||
|         $confirm  = $this->arg('confirm'); | ||||
|             // invitation code, if any | ||||
|             $code = $this->trimmed('code'); | ||||
|  | ||||
|         // invitation code, if any | ||||
|             if ($code) { | ||||
|                 $invite = Invitation::staticGet($code); | ||||
|             } | ||||
|  | ||||
|         $code = $this->trimmed('code'); | ||||
|             if (common_config('site', 'inviteonly') && !($code && $invite)) { | ||||
|                 $this->clientError(_('Sorry, only invited people can register.')); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|         $invite = null; | ||||
|             // Input scrubbing | ||||
|             $nickname = common_canonical_nickname($nickname); | ||||
|             $email    = common_canonical_email($email); | ||||
|  | ||||
|         if ($code) { | ||||
|             $invite = Invitation::staticGet($code); | ||||
|         } | ||||
|             if (!$this->boolean('license')) { | ||||
|                 $this->showForm(_('You can\'t register if you don\'t '. | ||||
|                                   'agree to the license.')); | ||||
|             } else if ($email && !Validate::email($email, true)) { | ||||
|                 $this->showForm(_('Not a valid email address.')); | ||||
|             } else if (!Validate::string($nickname, array('min_length' => 1, | ||||
|                                                           'max_length' => 64, | ||||
|                                                           'format' => NICKNAME_FMT))) { | ||||
|                 $this->showForm(_('Nickname must have only lowercase letters '. | ||||
|                                   'and numbers and no spaces.')); | ||||
|             } else if ($this->nicknameExists($nickname)) { | ||||
|                 $this->showForm(_('Nickname already in use. Try another one.')); | ||||
|             } else if (!User::allowed_nickname($nickname)) { | ||||
|                 $this->showForm(_('Not a valid nickname.')); | ||||
|             } else if ($this->emailExists($email)) { | ||||
|                 $this->showForm(_('Email address already exists.')); | ||||
|             } else if (!is_null($homepage) && (strlen($homepage) > 0) && | ||||
|                        !Validate::uri($homepage, | ||||
|                                       array('allowed_schemes' => | ||||
|                                             array('http', 'https')))) { | ||||
|                 $this->showForm(_('Homepage is not a valid URL.')); | ||||
|                 return; | ||||
|             } else if (!is_null($fullname) && mb_strlen($fullname) > 255) { | ||||
|                 $this->showForm(_('Full name is too long (max 255 chars).')); | ||||
|                 return; | ||||
|             } else if (!is_null($bio) && mb_strlen($bio) > 140) { | ||||
|                 $this->showForm(_('Bio is too long (max 140 chars).')); | ||||
|                 return; | ||||
|             } else if (!is_null($location) && mb_strlen($location) > 255) { | ||||
|                 $this->showForm(_('Location is too long (max 255 chars).')); | ||||
|                 return; | ||||
|             } else if (strlen($password) < 6) { | ||||
|                 $this->showForm(_('Password must be 6 or more characters.')); | ||||
|                 return; | ||||
|             } else if ($password != $confirm) { | ||||
|                 $this->showForm(_('Passwords don\'t match.')); | ||||
|             } else if ($user = User::register(array('nickname' => $nickname, | ||||
|                                                     'password' => $password, | ||||
|                                                     'email' => $email, | ||||
|                                                     'fullname' => $fullname, | ||||
|                                                     'homepage' => $homepage, | ||||
|                                                     'bio' => $bio, | ||||
|                                                     'location' => $location, | ||||
|                                                     'code' => $code))) { | ||||
|                 if (!$user) { | ||||
|                     $this->showForm(_('Invalid username or password.')); | ||||
|                     return; | ||||
|                 } | ||||
|                 // success! | ||||
|                 if (!common_set_user($user)) { | ||||
|                     $this->serverError(_('Error setting user.')); | ||||
|                     return; | ||||
|                 } | ||||
|                 // this is a real login | ||||
|                 common_real_login(true); | ||||
|                 if ($this->boolean('rememberme')) { | ||||
|                     common_debug('Adding rememberme cookie for ' . $nickname); | ||||
|                     common_rememberme($user); | ||||
|                 } | ||||
|  | ||||
|         if (common_config('site', 'inviteonly') && !($code && !empty($invite))) { | ||||
|             $this->clientError(_('Sorry, only invited people can register.')); | ||||
|             return; | ||||
|         } | ||||
|                 Event::handle('EndRegistrationTry', array($this)); | ||||
|  | ||||
|         // Input scrubbing | ||||
|  | ||||
|         $nickname = common_canonical_nickname($nickname); | ||||
|         $email    = common_canonical_email($email); | ||||
|  | ||||
|         if (!$this->boolean('license')) { | ||||
|             $this->showForm(_('You can\'t register if you don\'t '. | ||||
|                               'agree to the license.')); | ||||
|         } else if ($email && !Validate::email($email, true)) { | ||||
|             $this->showForm(_('Not a valid email address.')); | ||||
|         } else if (!Validate::string($nickname, array('min_length' => 1, | ||||
|                                                       'max_length' => 64, | ||||
|                                                       'format' => NICKNAME_FMT))) { | ||||
|             $this->showForm(_('Nickname must have only lowercase letters '. | ||||
|                               'and numbers and no spaces.')); | ||||
|         } else if ($this->nicknameExists($nickname)) { | ||||
|             $this->showForm(_('Nickname already in use. Try another one.')); | ||||
|         } else if (!User::allowed_nickname($nickname)) { | ||||
|             $this->showForm(_('Not a valid nickname.')); | ||||
|         } else if ($this->emailExists($email)) { | ||||
|             $this->showForm(_('Email address already exists.')); | ||||
|         } else if (!is_null($homepage) && (strlen($homepage) > 0) && | ||||
|                    !Validate::uri($homepage, | ||||
|                                   array('allowed_schemes' => | ||||
|                                         array('http', 'https')))) { | ||||
|             $this->showForm(_('Homepage is not a valid URL.')); | ||||
|             return; | ||||
|         } else if (!is_null($fullname) && mb_strlen($fullname) > 255) { | ||||
|             $this->showForm(_('Full name is too long (max 255 chars).')); | ||||
|             return; | ||||
|         } else if (!is_null($bio) && mb_strlen($bio) > 140) { | ||||
|             $this->showForm(_('Bio is too long (max 140 chars).')); | ||||
|             return; | ||||
|         } else if (!is_null($location) && mb_strlen($location) > 255) { | ||||
|             $this->showForm(_('Location is too long (max 255 chars).')); | ||||
|             return; | ||||
|         } else if (strlen($password) < 6) { | ||||
|             $this->showForm(_('Password must be 6 or more characters.')); | ||||
|             return; | ||||
|         } else if ($password != $confirm) { | ||||
|             $this->showForm(_('Passwords don\'t match.')); | ||||
|         } else if ($user = User::register(array('nickname' => $nickname, | ||||
|                                                 'password' => $password, | ||||
|                                                 'email' => $email, | ||||
|                                                 'fullname' => $fullname, | ||||
|                                                 'homepage' => $homepage, | ||||
|                                                 'bio' => $bio, | ||||
|                                                 'location' => $location, | ||||
|                                                 'code' => $code))) { | ||||
|             if (!$user) { | ||||
|                 // Re-init language env in case it changed (not yet, but soon) | ||||
|                 common_init_language(); | ||||
|                 $this->showSuccess(); | ||||
|             } else { | ||||
|                 $this->showForm(_('Invalid username or password.')); | ||||
|                 return; | ||||
|             } | ||||
|             // success! | ||||
|             if (!common_set_user($user)) { | ||||
|                 $this->serverError(_('Error setting user.')); | ||||
|                 return; | ||||
|             } | ||||
|             // this is a real login | ||||
|             common_real_login(true); | ||||
|             if ($this->boolean('rememberme')) { | ||||
|                 common_debug('Adding rememberme cookie for ' . $nickname); | ||||
|                 common_rememberme($user); | ||||
|             } | ||||
|             // Re-init language env in case it changed (not yet, but soon) | ||||
|             common_init_language(); | ||||
|             $this->showSuccess(); | ||||
|         } else { | ||||
|             $this->showForm(_('Invalid username or password.')); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -252,22 +291,24 @@ class RegisterAction extends Action | ||||
|  | ||||
|     // overrrided to add entry-title class | ||||
|     function showPageTitle() { | ||||
|         $this->element('h1', array('class' => 'entry-title'), $this->title()); | ||||
|         if (Event::handle('StartShowPageTitle', array($this))) { | ||||
|             $this->element('h1', array('class' => 'entry-title'), $this->title()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // overrided to add hentry, and content-inner class | ||||
|     function showContentBlock() | ||||
|      { | ||||
|          $this->elementStart('div', array('id' => 'content', 'class' => 'hentry')); | ||||
|          $this->showPageTitle(); | ||||
|          $this->showPageNoticeBlock(); | ||||
|          $this->elementStart('div', array('id' => 'content_inner', | ||||
|              'class' => 'entry-content')); | ||||
|          // show the actual content (forms, lists, whatever) | ||||
|          $this->showContent(); | ||||
|          $this->elementEnd('div'); | ||||
|          $this->elementEnd('div'); | ||||
|      } | ||||
|     { | ||||
|         $this->elementStart('div', array('id' => 'content', 'class' => 'hentry')); | ||||
|         $this->showPageTitle(); | ||||
|         $this->showPageNoticeBlock(); | ||||
|         $this->elementStart('div', array('id' => 'content_inner', | ||||
|                                          'class' => 'entry-content')); | ||||
|         // show the actual content (forms, lists, whatever) | ||||
|         $this->showContent(); | ||||
|         $this->elementEnd('div'); | ||||
|         $this->elementEnd('div'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Instructions or a notice for the page | ||||
| @@ -362,82 +403,85 @@ class RegisterAction extends Action | ||||
|         $this->element('legend', null, 'Account settings'); | ||||
|         $this->hidden('token', common_session_token()); | ||||
|  | ||||
|         if ($code) { | ||||
|             $this->hidden('code', $code); | ||||
|         if ($this->code) { | ||||
|             $this->hidden('code', $this->code); | ||||
|         } | ||||
|  | ||||
|         $this->elementStart('ul', 'form_data'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->input('nickname', _('Nickname'), $this->trimmed('nickname'), | ||||
|                      _('1-64 lowercase letters or numbers, '. | ||||
|                        'no punctuation or spaces. Required.')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->password('password', _('Password'), | ||||
|                         _('6 or more characters. Required.')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->password('confirm', _('Confirm'), | ||||
|                         _('Same as password above. Required.')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         if (!empty($invite) && $invite->address_type == 'email') { | ||||
|             $this->input('email', _('Email'), $invite->address, | ||||
|                          _('Used only for updates, announcements, '. | ||||
|                            'and password recovery')); | ||||
|         } else { | ||||
|             $this->input('email', _('Email'), $this->trimmed('email'), | ||||
|                          _('Used only for updates, announcements, '. | ||||
|                            'and password recovery')); | ||||
|         if (Event::handle('StartRegistrationFormData', array($this))) { | ||||
|             $this->elementStart('li'); | ||||
|             $this->input('nickname', _('Nickname'), $this->trimmed('nickname'), | ||||
|                          _('1-64 lowercase letters or numbers, '. | ||||
|                            'no punctuation or spaces. Required.')); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $this->password('password', _('Password'), | ||||
|                             _('6 or more characters. Required.')); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $this->password('confirm', _('Confirm'), | ||||
|                             _('Same as password above. Required.')); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             if ($this->invite && $this->invite->address_type == 'email') { | ||||
|                 $this->input('email', _('Email'), $this->invite->address, | ||||
|                              _('Used only for updates, announcements, '. | ||||
|                                'and password recovery')); | ||||
|             } else { | ||||
|                 $this->input('email', _('Email'), $this->trimmed('email'), | ||||
|                              _('Used only for updates, announcements, '. | ||||
|                                'and password recovery')); | ||||
|             } | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $this->input('fullname', _('Full name'), | ||||
|                          $this->trimmed('fullname'), | ||||
|                          _('Longer name, preferably your "real" name')); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $this->input('homepage', _('Homepage'), | ||||
|                          $this->trimmed('homepage'), | ||||
|                          _('URL of your homepage, blog, '. | ||||
|                            'or profile on another site')); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $this->textarea('bio', _('Bio'), | ||||
|                             $this->trimmed('bio'), | ||||
|                             _('Describe yourself and your '. | ||||
|                               'interests in 140 chars')); | ||||
|             $this->elementEnd('li'); | ||||
|             $this->elementStart('li'); | ||||
|             $this->input('location', _('Location'), | ||||
|                          $this->trimmed('location'), | ||||
|                          _('Where you are, like "City, '. | ||||
|                            'State (or Region), Country"')); | ||||
|             $this->elementEnd('li'); | ||||
|             Event::handle('EndRegistrationFormData', array($this)); | ||||
|             $this->elementStart('li', array('id' => 'settings_rememberme')); | ||||
|             $this->checkbox('rememberme', _('Remember me'), | ||||
|                             $this->boolean('rememberme'), | ||||
|                             _('Automatically login in the future; '. | ||||
|                               'not for shared computers!')); | ||||
|             $this->elementEnd('li'); | ||||
|             $attrs = array('type' => 'checkbox', | ||||
|                            'id' => 'license', | ||||
|                            'class' => 'checkbox', | ||||
|                            'name' => 'license', | ||||
|                            'value' => 'true'); | ||||
|             if ($this->boolean('license')) { | ||||
|                 $attrs['checked'] = 'checked'; | ||||
|             } | ||||
|             $this->elementStart('li'); | ||||
|             $this->element('input', $attrs); | ||||
|             $this->elementStart('label', array('class' => 'checkbox', 'for' => 'license')); | ||||
|             $this->text(_('My text and files are available under ')); | ||||
|             $this->element('a', array('href' => common_config('license', 'url')), | ||||
|                            common_config('license', 'title'), _("Creative Commons Attribution 3.0")); | ||||
|             $this->text(_(' except this private data: password, '. | ||||
|                           'email address, IM address, and phone number.')); | ||||
|             $this->elementEnd('label'); | ||||
|             $this->elementEnd('li'); | ||||
|         } | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->input('fullname', _('Full name'), | ||||
|                      $this->trimmed('fullname'), | ||||
|                      _('Longer name, preferably your "real" name')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->input('homepage', _('Homepage'), | ||||
|                      $this->trimmed('homepage'), | ||||
|                      _('URL of your homepage, blog, '. | ||||
|                        'or profile on another site')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->textarea('bio', _('Bio'), | ||||
|                         $this->trimmed('bio'), | ||||
|                         _('Describe yourself and your '. | ||||
|                           'interests in 140 chars')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li'); | ||||
|         $this->input('location', _('Location'), | ||||
|                      $this->trimmed('location'), | ||||
|                      _('Where you are, like "City, '. | ||||
|                        'State (or Region), Country"')); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementStart('li', array('id' => 'settings_rememberme')); | ||||
|         $this->checkbox('rememberme', _('Remember me'), | ||||
|                         $this->boolean('rememberme'), | ||||
|                         _('Automatically login in the future; '. | ||||
|                           'not for shared computers!')); | ||||
|         $this->elementEnd('li'); | ||||
|         $attrs = array('type' => 'checkbox', | ||||
|                        'id' => 'license', | ||||
|                        'class' => 'checkbox', | ||||
|                        'name' => 'license', | ||||
|                        'value' => 'true'); | ||||
|         if ($this->boolean('license')) { | ||||
|             $attrs['checked'] = 'checked'; | ||||
|         } | ||||
|         $this->elementStart('li'); | ||||
|         $this->element('input', $attrs); | ||||
|         $this->elementStart('label', array('class' => 'checkbox', 'for' => 'license')); | ||||
|         $this->text(_('My text and files are available under ')); | ||||
|         $this->element('a', array('href' => common_config('license', 'url')), | ||||
|                        common_config('license', 'title'), _("Creative Commons Attribution 3.0")); | ||||
|         $this->text(_(' except this private data: password, '. | ||||
|                       'email address, IM address, and phone number.')); | ||||
|         $this->elementEnd('label'); | ||||
|         $this->elementEnd('li'); | ||||
|         $this->elementEnd('ul'); | ||||
|         $this->submit('submit', _('Register')); | ||||
|         $this->elementEnd('fieldset'); | ||||
| @@ -519,3 +563,4 @@ class RegisterAction extends Action | ||||
|         $nav->show(); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -35,7 +35,7 @@ if (!defined('LACONICA')) { | ||||
| require_once INSTALLDIR.'/lib/noticelist.php'; | ||||
| require_once INSTALLDIR.'/lib/feedlist.php'; | ||||
|  | ||||
| define('MEMBERS_PER_SECTION', 81); | ||||
| define('MEMBERS_PER_SECTION', 27); | ||||
|  | ||||
| /** | ||||
|  * Group main page | ||||
| @@ -361,7 +361,7 @@ class ShowgroupAction extends Action | ||||
|              $this->element('p', null, _('(None)')); | ||||
|         } | ||||
|  | ||||
|         if ($cnt == MEMBERS_PER_SECTION) { | ||||
|         if ($cnt > MEMBERS_PER_SECTION) { | ||||
|             $this->element('a', array('href' => common_local_url('groupmembers', | ||||
|                                                                  array('nickname' => $this->group->nickname))), | ||||
|                            _('All members')); | ||||
|   | ||||
| @@ -118,6 +118,16 @@ class SubscribersAction extends GalleryAction | ||||
|         $this->raw(common_markup_to_html($message)); | ||||
|         $this->elementEnd('div'); | ||||
|     } | ||||
|  | ||||
|     function showSections() | ||||
|     { | ||||
|         parent::showSections(); | ||||
|         $cloud = new SubscribersPeopleTagCloudSection($this); | ||||
|         $cloud->show(); | ||||
|  | ||||
|         $cloud2 = new SubscribersPeopleSelfTagCloudSection($this); | ||||
|         $cloud2->show(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| class SubscribersList extends ProfileList | ||||
|   | ||||
| @@ -125,6 +125,16 @@ class SubscriptionsAction extends GalleryAction | ||||
|         $this->raw(common_markup_to_html($message)); | ||||
|         $this->elementEnd('div'); | ||||
|     } | ||||
|  | ||||
|     function showSections() | ||||
|     { | ||||
|         parent::showSections(); | ||||
|         $cloud = new SubscriptionsPeopleTagCloudSection($this); | ||||
|         $cloud->show(); | ||||
|  | ||||
|         $cloud2 = new SubscriptionsPeopleSelfTagCloudSection($this); | ||||
|         $cloud2->show(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| class SubscriptionsList extends ProfileList | ||||
|   | ||||
| @@ -119,6 +119,7 @@ create table notice ( | ||||
|     index notice_profile_id_idx (profile_id), | ||||
|     index notice_conversation_idx (conversation), | ||||
|     index notice_created_idx (created), | ||||
|     index notice_replyto_idx (reply_to), | ||||
|     FULLTEXT(content) | ||||
| ) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci; | ||||
|  | ||||
|   | ||||
							
								
								
									
										28
									
								
								js/util.js
									
									
									
									
									
								
							
							
						
						| @@ -166,28 +166,36 @@ $(document).ready(function(){ | ||||
| 																		   $("#notice_action-submit").addClass("disabled"); | ||||
| 																		   return true; | ||||
| 												 						 }, | ||||
| 					   success: function(xml) {	if ($("#error", xml).length > 0 || $("#command_result", xml).length > 0) { | ||||
| 					   success: function(xml) {	if ($("#error", xml).length > 0) { | ||||
| 													var result = document._importNode($("p", xml).get(0), true); | ||||
| 													result = result.textContent || result.innerHTML; | ||||
| 													alert(result); | ||||
| 												} | ||||
| 												else { | ||||
| 													$("#notices_primary .notices").prepend(document._importNode($("li", xml).get(0), true)); | ||||
| 												    if ($("#command_result", xml).length > 0) { | ||||
| 													    var result = document._importNode($("p", xml).get(0), true); | ||||
| 													    result = result.textContent || result.innerHTML; | ||||
| 													    alert(result); | ||||
|                                                     } | ||||
|                                                     else { | ||||
| 													    $("#notices_primary .notices").prepend(document._importNode($("li", xml).get(0), true)); | ||||
| 													    $("#notices_primary .notice:first").css({display:"none"}); | ||||
| 													    $("#notices_primary .notice:first").fadeIn(2500); | ||||
| 													    NoticeHover(); | ||||
| 													    NoticeReply(); | ||||
| 													} | ||||
| 													$("#notice_data-text").val(""); | ||||
| 													counter(); | ||||
| 													$("#notices_primary .notice:first").css({display:"none"}); | ||||
| 													$("#notices_primary .notice:first").fadeIn(2500); | ||||
| 													NoticeHover(); | ||||
| 													NoticeReply(); | ||||
|                                                     counter(); | ||||
| 												} | ||||
| 												$("#form_notice").removeClass("processing"); | ||||
| 												$("#notice_action-submit").removeAttr("disabled"); | ||||
| 												$("#notice_action-submit").removeClass("disabled"); | ||||
| 											 } | ||||
| 					   }; | ||||
| 	$("#form_notice").ajaxForm(PostNotice); | ||||
| 	$("#form_notice").each(addAjaxHidden); | ||||
|  | ||||
|     if (document.body.id  != 'inbox' && document.body.id != 'outbox') { | ||||
| 	    $("#form_notice").ajaxForm(PostNotice); | ||||
| 	    $("#form_notice").each(addAjaxHidden); | ||||
|     } | ||||
|     NoticeHover(); | ||||
|     NoticeReply(); | ||||
| }); | ||||
|   | ||||
| @@ -93,43 +93,45 @@ class PersonalGroupNav extends Widget | ||||
|  | ||||
|         $this->out->elementStart('ul', array('class' => 'nav')); | ||||
|  | ||||
|         $this->out->menuItem(common_local_url('all', array('nickname' => | ||||
|                                                        $nickname)), | ||||
|                          _('Personal'), | ||||
|                          sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), | ||||
|                          $action == 'all', 'nav_timeline_personal'); | ||||
|         $this->out->menuItem(common_local_url('replies', array('nickname' => | ||||
|                                                               $nickname)), | ||||
|                          _('Replies'), | ||||
|                          sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), | ||||
|                          $action == 'replies', 'nav_timeline_replies'); | ||||
|         $this->out->menuItem(common_local_url('showstream', array('nickname' => | ||||
|                                                               $nickname)), | ||||
|                          _('Profile'), | ||||
|                          ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname, | ||||
|                          $action == 'showstream', 'nav_profile'); | ||||
|         $this->out->menuItem(common_local_url('showfavorites', array('nickname' => | ||||
|                                                               $nickname)), | ||||
|                          _('Favorites'), | ||||
|                          sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')), | ||||
|                          $action == 'showfavorites', 'nav_timeline_favorites'); | ||||
|         if (Event::handle('StartPersonalGroupNav', array($this))) { | ||||
|             $this->out->menuItem(common_local_url('all', array('nickname' => | ||||
|                                                            $nickname)), | ||||
|                              _('Personal'), | ||||
|                              sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), | ||||
|                              $action == 'all', 'nav_timeline_personal'); | ||||
|             $this->out->menuItem(common_local_url('replies', array('nickname' => | ||||
|                                                                   $nickname)), | ||||
|                              _('Replies'), | ||||
|                              sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), | ||||
|                              $action == 'replies', 'nav_timeline_replies'); | ||||
|             $this->out->menuItem(common_local_url('showstream', array('nickname' => | ||||
|                                                                   $nickname)), | ||||
|                              _('Profile'), | ||||
|                              ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname, | ||||
|                              $action == 'showstream', 'nav_profile'); | ||||
|             $this->out->menuItem(common_local_url('showfavorites', array('nickname' => | ||||
|                                                                   $nickname)), | ||||
|                              _('Favorites'), | ||||
|                              sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')), | ||||
|                              $action == 'showfavorites', 'nav_timeline_favorites'); | ||||
|  | ||||
|         $cur = common_current_user(); | ||||
|             $cur = common_current_user(); | ||||
|  | ||||
|         if ($cur && $cur->id == $user->id) { | ||||
|             if ($cur && $cur->id == $user->id) { | ||||
|  | ||||
|             $this->out->menuItem(common_local_url('inbox', array('nickname' => | ||||
|                                                                      $nickname)), | ||||
|                              _('Inbox'), | ||||
|                              _('Your incoming messages'), | ||||
|                              $action == 'inbox'); | ||||
|             $this->out->menuItem(common_local_url('outbox', array('nickname' => | ||||
|                                                                      $nickname)), | ||||
|                              _('Outbox'), | ||||
|                              _('Your sent messages'), | ||||
|                              $action == 'outbox'); | ||||
|                 $this->out->menuItem(common_local_url('inbox', array('nickname' => | ||||
|                                                                          $nickname)), | ||||
|                                  _('Inbox'), | ||||
|                                  _('Your incoming messages'), | ||||
|                                  $action == 'inbox'); | ||||
|                 $this->out->menuItem(common_local_url('outbox', array('nickname' => | ||||
|                                                                          $nickname)), | ||||
|                                  _('Outbox'), | ||||
|                                  _('Your sent messages'), | ||||
|                                  $action == 'outbox'); | ||||
|             } | ||||
|             Event::handle('EndPersonalGroupNav', array($this)); | ||||
|         } | ||||
|  | ||||
|         $this->out->elementEnd('ul'); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -51,7 +51,7 @@ class SearchAction extends Action | ||||
|      * | ||||
|      * @return boolean true | ||||
|      */ | ||||
|     function isReadOnly($args) | ||||
|     function isReadOnly() | ||||
|     { | ||||
|         return true; | ||||
|     } | ||||
|   | ||||
							
								
								
									
										76
									
								
								lib/subpeopletagcloudsection.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,76 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Laconica, the distributed open-source microblogging tool | ||||
|  * | ||||
|  * Personal tag cloud section | ||||
|  * | ||||
|  * 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  Widget | ||||
|  * @package   Laconica | ||||
|  * @author    Evan Prodromou <evan@controlyourself.ca> | ||||
|  * @copyright 2009 Control Yourself, Inc. | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link      http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| if (!defined('LACONICA')) { | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Personal tag cloud section | ||||
|  * | ||||
|  * @category Widget | ||||
|  * @package  Laconica | ||||
|  * @author   Evan Prodromou <evan@controlyourself.ca> | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link     http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| class SubPeopleTagCloudSection extends TagCloudSection | ||||
| { | ||||
|     function getTags() | ||||
|     { | ||||
|         $qry = $this->query(); | ||||
|         $limit = TAGS_PER_SECTION; | ||||
|         $offset = 0; | ||||
|  | ||||
|         if (common_config('db','type') == 'pgsql') { | ||||
|             $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; | ||||
|         } else { | ||||
|             $qry .= ' LIMIT ' . $offset . ', ' . $limit; | ||||
|         } | ||||
|  | ||||
|         $profile_tag = Memcached_DataObject::cachedQuery('Profile_tag', | ||||
|                                                  sprintf($qry, | ||||
|                                                          $this->out->user->id)); | ||||
|         return $profile_tag; | ||||
|     } | ||||
|  | ||||
|     function tagUrl($tag) { | ||||
|         return common_local_url('peopletag', array('tag' => $tag)); | ||||
|     } | ||||
|  | ||||
|     function showTag($tag, $weight, $relative) { | ||||
|         $rel = 'tag-cloud-'; | ||||
|         $rel .= 1+intval(7 * $relative * $weight - 0.01); | ||||
|  | ||||
|         $this->out->elementStart('li', $rel); | ||||
|         $this->out->element('a', array('href' => $this->tagUrl($tag)), $tag); | ||||
|         $this->out->elementEnd('li'); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										54
									
								
								lib/subscriberspeopleselftagcloudsection.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,54 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Laconica, the distributed open-source microblogging tool | ||||
|  * | ||||
|  * Personal tag cloud section | ||||
|  * | ||||
|  * 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  Widget | ||||
|  * @package   Laconica | ||||
|  * @author    Evan Prodromou <evan@controlyourself.ca> | ||||
|  * @copyright 2009 Control Yourself, Inc. | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link      http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| if (!defined('LACONICA')) { | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Personal tag cloud section | ||||
|  * | ||||
|  * @category Widget | ||||
|  * @package  Laconica | ||||
|  * @author   Evan Prodromou <evan@controlyourself.ca> | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link     http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| class SubscribersPeopleSelfTagCloudSection extends SubPeopleTagCloudSection | ||||
| { | ||||
|     function title() | ||||
|     { | ||||
|         return _('People Tagcloud as self-tagged'); | ||||
|     } | ||||
|  | ||||
|     function query() { | ||||
|         return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscriber where subscribed=%d and subscribed != subscriber and tagger = tagged group by tag order by weight desc'; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										60
									
								
								lib/subscriberspeopletagcloudsection.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,60 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Laconica, the distributed open-source microblogging tool | ||||
|  * | ||||
|  * Personal tag cloud section | ||||
|  * | ||||
|  * 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  Widget | ||||
|  * @package   Laconica | ||||
|  * @author    Evan Prodromou <evan@controlyourself.ca> | ||||
|  * @copyright 2009 Control Yourself, Inc. | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link      http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| if (!defined('LACONICA')) { | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Personal tag cloud section | ||||
|  * | ||||
|  * @category Widget | ||||
|  * @package  Laconica | ||||
|  * @author   Evan Prodromou <evan@controlyourself.ca> | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link     http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| class SubscribersPeopleTagCloudSection extends SubPeopleTagCloudSection | ||||
| { | ||||
|     function title() | ||||
|     { | ||||
|         return _('People Tagcloud as tagged'); | ||||
|     } | ||||
|  | ||||
|     function tagUrl($tag) { | ||||
|         $nickname = $this->out->profile->nickname; | ||||
|         return common_local_url('subscribers', array('nickname' => $nickname, 'tag' => $tag)); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     function query() { | ||||
|         return 'select tag, count(tag) as weight from subscription left join profile_tag on subscriber=tagged and subscribed=tagger where subscribed=%d and subscriber != subscribed group by tag order by weight desc'; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										54
									
								
								lib/subscriptionspeopleselftagcloudsection.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,54 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Laconica, the distributed open-source microblogging tool | ||||
|  * | ||||
|  * Personal tag cloud section | ||||
|  * | ||||
|  * 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  Widget | ||||
|  * @package   Laconica | ||||
|  * @author    Evan Prodromou <evan@controlyourself.ca> | ||||
|  * @copyright 2009 Control Yourself, Inc. | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link      http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| if (!defined('LACONICA')) { | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Personal tag cloud section | ||||
|  * | ||||
|  * @category Widget | ||||
|  * @package  Laconica | ||||
|  * @author   Evan Prodromou <evan@controlyourself.ca> | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link     http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| class SubscriptionsPeopleSelfTagCloudSection extends SubPeopleTagCloudSection | ||||
| { | ||||
|     function title() | ||||
|     { | ||||
|         return _('People Tagcloud as self-tagged'); | ||||
|     } | ||||
|  | ||||
|     function query() { | ||||
|         return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscriber where subscribed=%d and subscriber != subscribed and tagger = tagged group by tag order by weight desc'; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										59
									
								
								lib/subscriptionspeopletagcloudsection.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,59 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Laconica, the distributed open-source microblogging tool | ||||
|  * | ||||
|  * Personal tag cloud section | ||||
|  * | ||||
|  * 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  Widget | ||||
|  * @package   Laconica | ||||
|  * @author    Evan Prodromou <evan@controlyourself.ca> | ||||
|  * @copyright 2009 Control Yourself, Inc. | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link      http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| if (!defined('LACONICA')) { | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Personal tag cloud section | ||||
|  * | ||||
|  * @category Widget | ||||
|  * @package  Laconica | ||||
|  * @author   Evan Prodromou <evan@controlyourself.ca> | ||||
|  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link     http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| class SubscriptionsPeopleTagCloudSection extends SubPeopleTagCloudSection | ||||
| { | ||||
|     function title() | ||||
|     { | ||||
|         return _('People Tagcloud as tagged'); | ||||
|     } | ||||
|  | ||||
|     function tagUrl($tag) { | ||||
|         $nickname = $this->out->profile->nickname; | ||||
|         return common_local_url('subscriptions', array('nickname' => $nickname, 'tag' => $tag)); | ||||
|     } | ||||
|  | ||||
|     function query() { | ||||
|         return 'select tag, count(tag) as weight from subscription left join profile_tag on subscriber=tagger and subscribed=tagged where subscriber=%d and subscriber != subscribed group by tag order by weight desc'; | ||||
|     } | ||||
| } | ||||
| @@ -418,7 +418,7 @@ class TwitterapiAction extends Action | ||||
|     function date_twitter($dt) | ||||
|     { | ||||
|         $t = strtotime($dt); | ||||
|         return date("D M d G:i:s O Y", $t); | ||||
|         return date("D M d H:i:s O Y", $t); | ||||
|     } | ||||
|  | ||||
|     // XXX: Candidate for a general utility method somewhere? | ||||
|   | ||||
| @@ -1392,3 +1392,4 @@ function common_database_tablename($tablename) | ||||
|   //table prefixes could be added here later | ||||
|   return $tablename; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -54,6 +54,13 @@ class JabberQueueHandler extends XmppQueueHandler | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Abort immediately if xmpp is not enabled, otherwise the daemon chews up | ||||
| // lots of CPU trying to connect to unconfigured servers | ||||
| if (common_config('xmpp','enabled')==false) { | ||||
|     print "Aborting daemon - xmpp is disabled\n"; | ||||
|     exit(); | ||||
| } | ||||
|  | ||||
| ini_set("max_execution_time", "0"); | ||||
| ini_set("max_input_time", "0"); | ||||
| set_time_limit(0); | ||||
|   | ||||
| @@ -52,6 +52,13 @@ class PublicQueueHandler extends XmppQueueHandler | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Abort immediately if xmpp is not enabled, otherwise the daemon chews up | ||||
| // lots of CPU trying to connect to unconfigured servers | ||||
| if (common_config('xmpp','enabled')==false) { | ||||
|     print "Aborting daemon - xmpp is disabled\n"; | ||||
|     exit(); | ||||
| } | ||||
|  | ||||
| ini_set("max_execution_time", "0"); | ||||
| ini_set("max_input_time", "0"); | ||||
| set_time_limit(0); | ||||
|   | ||||
| @@ -140,6 +140,13 @@ class XmppConfirmHandler extends XmppQueueHandler | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Abort immediately if xmpp is not enabled, otherwise the daemon chews up | ||||
| // lots of CPU trying to connect to unconfigured servers | ||||
| if (common_config('xmpp','enabled')==false) { | ||||
|     print "Aborting daemon - xmpp is disabled\n"; | ||||
|     exit(); | ||||
| } | ||||
|  | ||||
| ini_set("max_execution_time", "0"); | ||||
| ini_set("max_input_time", "0"); | ||||
| set_time_limit(0); | ||||
|   | ||||
| @@ -321,6 +321,13 @@ class XMPPDaemon extends Daemon | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Abort immediately if xmpp is not enabled, otherwise the daemon chews up | ||||
| // lots of CPU trying to connect to unconfigured servers | ||||
| if (common_config('xmpp','enabled')==false) { | ||||
|     print "Aborting daemon - xmpp is disabled\n"; | ||||
|     exit(); | ||||
| } | ||||
|  | ||||
| ini_set("max_execution_time", "0"); | ||||
| ini_set("max_input_time", "0"); | ||||
| set_time_limit(0); | ||||
|   | ||||
							
								
								
									
										1188
									
								
								theme/earthy/css/base.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										251
									
								
								theme/earthy/css/display.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,251 @@ | ||||
| /** theme: earthy | ||||
|  * | ||||
|  * @package   Laconica | ||||
|  * @author Sarven Capadisli <csarven@controlyourself.ca> | ||||
|  * @copyright 2009 Control Yourself, Inc. | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link      http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| @import url(base.css); | ||||
|  | ||||
| html, | ||||
| body, | ||||
| a:active { | ||||
| background-color:#665500; | ||||
| } | ||||
| body { | ||||
| font-family: Verdana, sans-serif; | ||||
| font-size:1em; | ||||
| } | ||||
| address { | ||||
| margin-right:7.18%; | ||||
| } | ||||
|  | ||||
| h1 { | ||||
| color:#fff; | ||||
| } | ||||
|  | ||||
| input, textarea, select, option { | ||||
| font-family: Verdana, sans-serif; | ||||
| } | ||||
| input, textarea, select, | ||||
| .entity_remote_subscribe { | ||||
| border-color:#aaa; | ||||
| } | ||||
| #filter_tags ul li { | ||||
| border-color:#ddd; | ||||
| } | ||||
|  | ||||
| .form_settings input.form_action-secondary { | ||||
| background:none; | ||||
| } | ||||
|  | ||||
| input.submit, | ||||
| #form_notice.warning #notice_text-count, | ||||
| .form_settings .form_note, | ||||
| .entity_remote_subscribe { | ||||
| background-color:#9BB43E; | ||||
| } | ||||
|  | ||||
| input:focus, textarea:focus, select:focus, | ||||
| #form_notice.warning #notice_data-text { | ||||
| border-color:#9BB43E; | ||||
| } | ||||
| input.submit, | ||||
| .entity_remote_subscribe { | ||||
| color:#dddd33; | ||||
| } | ||||
|  | ||||
| a, | ||||
| div.notice-options input, | ||||
| .form_user_block input.submit, | ||||
| .form_user_unblock input.submit, | ||||
| .entity_send-a-message a, | ||||
| .form_user_nudge input.submit, | ||||
| .entity_nudge p, | ||||
| .form_settings input.form_action-secondary { | ||||
| color:#ee4400; | ||||
| } | ||||
|  | ||||
| .notice, | ||||
| .profile { | ||||
| border-color:#DDAA00; | ||||
| } | ||||
| .section .profile { | ||||
| border-top-color:#aaaa66; | ||||
| } | ||||
|  | ||||
| #content .notice p.entry-content a:visited { | ||||
| background-color:#fcfcfc; | ||||
| } | ||||
| #content .notice p.entry-content .vcard a { | ||||
| background-color:#fcfffc; | ||||
| } | ||||
|  | ||||
| #aside_primary { | ||||
| background-color:#DDAA00; | ||||
| } | ||||
|  | ||||
| #notice_text-count { | ||||
| color:#333; | ||||
| } | ||||
| #form_notice.warning #notice_text-count { | ||||
| color:#000; | ||||
| } | ||||
| #form_notice.processing #notice_action-submit { | ||||
| background:#dddd33 url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%; | ||||
| cursor:wait; | ||||
| text-indent:-9999px; | ||||
| } | ||||
|  | ||||
| #content, | ||||
| #site_nav_local_views .nav, | ||||
| #site_nav_local_views a, | ||||
| #aside_primary { | ||||
| border-color:#dddd33; | ||||
| } | ||||
| #content .notice, | ||||
| #content .profile, | ||||
| #site_nav_local_views .current a { | ||||
| background-color:#dddd33; | ||||
| } | ||||
| #site_nav_local_views .current a { | ||||
| color:#EE4400; | ||||
| } | ||||
| #site_nav_local_views a { | ||||
| background-color:rgba(255, 255, 255, 0.2); | ||||
| color:#fff; | ||||
| } | ||||
| #site_nav_local_views a:hover { | ||||
| background-color:rgba(255, 255, 255, 0.4); | ||||
| } | ||||
|  | ||||
| .error { | ||||
| background-color:#F7E8E8; | ||||
| } | ||||
| .success { | ||||
| background-color:#EFF3DC; | ||||
| } | ||||
|  | ||||
| #anon_notice { | ||||
| background-color:#aaaa66; | ||||
| color:#dddd33; | ||||
| border-color:#dddd33; | ||||
| } | ||||
|  | ||||
| #showstream #anon_notice { | ||||
| background-color:#9BB43E; | ||||
| } | ||||
|  | ||||
| #export_data li a { | ||||
| background-repeat:no-repeat; | ||||
| background-position:0 45%; | ||||
| } | ||||
| #export_data li a.rss { | ||||
| background-image:url(../../base/images/icons/icon_rss.png); | ||||
| } | ||||
| #export_data li a.atom { | ||||
| background-image:url(../../base/images/icons/icon_atom.png); | ||||
| } | ||||
| #export_data li a.foaf { | ||||
| background-image:url(../../base/images/icons/icon_foaf.gif); | ||||
| } | ||||
|  | ||||
| .entity_edit a, | ||||
| .entity_send-a-message a, | ||||
| .form_user_nudge input.submit, | ||||
| .form_user_block input.submit, | ||||
| .form_user_unblock input.submit, | ||||
| .entity_nudge p { | ||||
| background-position: 0 40%; | ||||
| background-repeat: no-repeat; | ||||
| background-color:transparent; | ||||
| } | ||||
| .form_group_join input.submit, | ||||
| .form_group_leave input.submit | ||||
| .form_user_subscribe input.submit, | ||||
| .form_user_unsubscribe input.submit { | ||||
| background-color:#9BB43E; | ||||
| color:#dddd33; | ||||
| } | ||||
| .form_user_unsubscribe input.submit, | ||||
| .form_group_leave input.submit, | ||||
| .form_user_authorization input.reject { | ||||
| background-color:#aaaa66; | ||||
| } | ||||
|  | ||||
| .entity_edit a { | ||||
| background-image:url(../../base/images/icons/twotone/green/edit.gif); | ||||
| } | ||||
| .entity_send-a-message a { | ||||
| background-image:url(../../base/images/icons/twotone/green/quote.gif); | ||||
| } | ||||
| .entity_nudge p, | ||||
| .form_user_nudge input.submit { | ||||
| background-image:url(../../base/images/icons/twotone/green/mail.gif); | ||||
| } | ||||
| .form_user_block input.submit, | ||||
| .form_user_unblock input.submit { | ||||
| background-image:url(../../base/images/icons/twotone/green/shield.gif); | ||||
| } | ||||
|  | ||||
| /* NOTICES */ | ||||
| .notices li.over { | ||||
| background-color:#fcfcfc; | ||||
| } | ||||
|  | ||||
| .notice-options .notice_reply a, | ||||
| .notice-options form input.submit { | ||||
| background-color:transparent; | ||||
| } | ||||
| .notice-options .notice_reply a { | ||||
| background:transparent url(../../base/images/icons/twotone/green/reply.gif) no-repeat 0 45%; | ||||
| } | ||||
| .notice-options form.form_favor input.submit { | ||||
| background:transparent url(../../base/images/icons/twotone/green/favourite.gif) no-repeat 0 45%; | ||||
| } | ||||
| .notice-options form.form_disfavor input.submit { | ||||
| background:transparent url(../../base/images/icons/twotone/green/disfavourite.gif) no-repeat 0 45%; | ||||
| } | ||||
| .notice-options .notice_delete a { | ||||
| background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-repeat 0 45%; | ||||
| } | ||||
|  | ||||
| .notices div.entry-content, | ||||
| .notices div.notice-options { | ||||
| opacity:0.4; | ||||
| } | ||||
| .notices li.hover div.entry-content, | ||||
| .notices li.hover div.notice-options { | ||||
| opacity:1; | ||||
| } | ||||
| div.entry-content { | ||||
| color:#333; | ||||
| } | ||||
| div.notice-options a, | ||||
| div.notice-options input { | ||||
| font-family:sans-serif; | ||||
| } | ||||
| .notices li.hover { | ||||
| /*background-color:#fcfcfc;*/ | ||||
| } | ||||
| /*END: NOTICES */ | ||||
|  | ||||
| #new_group a { | ||||
| background:transparent url(../../base/images/icons/twotone/green/news.gif) no-repeat 0 45%; | ||||
| } | ||||
|  | ||||
| .pagination .nav_prev a, | ||||
| .pagination .nav_next a { | ||||
| background-repeat:no-repeat; | ||||
| border-color:#DDAA00; | ||||
| } | ||||
| .pagination .nav_prev a { | ||||
| background-image:url(../../base/images/icons/twotone/green/arrow-left.gif); | ||||
| background-position:10% 45%; | ||||
| } | ||||
| .pagination .nav_next a { | ||||
| background-image:url(../../base/images/icons/twotone/green/arrow-right.gif); | ||||
| background-position:90% 45%; | ||||
| } | ||||
							
								
								
									
										9
									
								
								theme/earthy/css/ie.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,9 @@ | ||||
| /* IE specific styles */ | ||||
|  | ||||
| .notice-options input.submit { | ||||
| color:#fff; | ||||
| } | ||||
|  | ||||
| #site_nav_local_views a { | ||||
| background-color:#D0DFE7; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								theme/earthy/default-avatar-mini.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 646 B | 
							
								
								
									
										
											BIN
										
									
								
								theme/earthy/default-avatar-profile.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								theme/earthy/default-avatar-stream.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								theme/earthy/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.9 KiB | 
							
								
								
									
										1205
									
								
								theme/otalk/css/base.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										293
									
								
								theme/otalk/css/display.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,293 @@ | ||||
| /** theme: otalk | ||||
|  * | ||||
|  * @package   Laconica | ||||
|  * @author Sarven Capadisli <csarven@controlyourself.ca> | ||||
|  * @copyright 2009 Control Yourself, Inc. | ||||
|  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | ||||
|  * @link      http://laconi.ca/ | ||||
|  */ | ||||
|  | ||||
| @import url(base.css); | ||||
|  | ||||
| html { | ||||
| } | ||||
|  | ||||
| html, | ||||
| body, | ||||
| a:active { | ||||
| /*background-color:#F0F2F5;*/ | ||||
| } | ||||
| body { | ||||
| font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; | ||||
| font-size:1em; | ||||
| background:#ddd url(../images/illustrations/illu_pattern-01.png) repeat 0 0; | ||||
| background-color:rgba(127, 127, 127, 0.1); | ||||
| } | ||||
| address { | ||||
| margin-right:7.18%; | ||||
| } | ||||
|  | ||||
| input, textarea, select, option { | ||||
| font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; | ||||
| } | ||||
| input, textarea, select, | ||||
| .entity_remote_subscribe { | ||||
| border-color:#aaa; | ||||
| } | ||||
| #filter_tags ul li { | ||||
| border-color:#ddd; | ||||
| } | ||||
|  | ||||
| .form_settings input.form_action-secondary { | ||||
| background:none; | ||||
| } | ||||
|  | ||||
| input.submit, | ||||
| #form_notice.warning #notice_text-count, | ||||
| .form_settings .form_note, | ||||
| .entity_remote_subscribe { | ||||
| background-color:#9BB43E; | ||||
| } | ||||
|  | ||||
| input:focus, textarea:focus, select:focus, | ||||
| #form_notice.warning #notice_data-text { | ||||
| border-color:#9BB43E; | ||||
| } | ||||
| input.submit, | ||||
| .entity_remote_subscribe { | ||||
| color:#fff; | ||||
| } | ||||
|  | ||||
| a, | ||||
| div.notice-options input, | ||||
| .form_user_block input.submit, | ||||
| .form_user_unblock input.submit, | ||||
| .entity_send-a-message a, | ||||
| .form_user_nudge input.submit, | ||||
| .entity_nudge p, | ||||
| .form_settings input.form_action-secondary { | ||||
| color:#8F0000; | ||||
| } | ||||
|  | ||||
| .notice, | ||||
| .profile { | ||||
| border-color:#CEE1E9; | ||||
| } | ||||
| #content .notice .entry-title, | ||||
| input, textarea, select, option, | ||||
| .pagination .nav_prev a, | ||||
| .pagination .nav_next a { | ||||
| background-color:rgba(255,255,255,0.8); | ||||
| } | ||||
|  | ||||
| #content .notices li.hover .entry-title { | ||||
| background-color:rgba(255,255,255,0.9); | ||||
| } | ||||
|  | ||||
| #content .notice:nth-child(1) .entry-title { | ||||
| background-color:rgba(255,255,255,0.95); | ||||
| } | ||||
| #content .notice:nth-child(2) .entry-title { | ||||
| background-color:rgba(255,255,255,0.9); | ||||
| } | ||||
| #content .notice:nth-child(3) .entry-title { | ||||
| background-color:rgba(255,255,255,0.8); | ||||
| } | ||||
| #content .notice:nth-child(4) .entry-title { | ||||
| background-color:rgba(255,255,255,0.7); | ||||
| } | ||||
| #content .notice:nth-child(5) .entry-title { | ||||
| background-color:rgba(255,255,255,0.6); | ||||
| } | ||||
| #content .notice:nth-child(6) .entry-title { | ||||
| background-color:rgba(255,255,255,0.5); | ||||
| } | ||||
| #content .notice:nth-child(7) .entry-title { | ||||
| background-color:rgba(255,255,255,0.4); | ||||
| } | ||||
| #content .notice:nth-child(8) .entry-title { | ||||
| background-color:rgba(255,255,255,0.3); | ||||
| } | ||||
| #content .notice:nth-child(9) .entry-title { | ||||
| background-color:rgba(255,255,255,0.2); | ||||
| } | ||||
| #content .notice:nth-child(10) { | ||||
| background-color:rgba(255,255,255,0.1); | ||||
| } | ||||
|  | ||||
|  | ||||
| #content .notice .author .photo { | ||||
| background:url(../images/illustrations/illu_arrow-left-01.gif) no-repeat 100% 0; | ||||
| } | ||||
|  | ||||
| .section .profile { | ||||
| border-top-color:#87B4C8; | ||||
| } | ||||
|  | ||||
| #aside_primary { | ||||
| background-color:rgba(206, 225, 233,0.5); | ||||
| } | ||||
|  | ||||
| #notice_text-count { | ||||
| color:#333; | ||||
| } | ||||
| #form_notice.warning #notice_text-count { | ||||
| color:#000; | ||||
| } | ||||
| #form_notice.processing #notice_action-submit { | ||||
| background:#fff url(../../base/images/icons/icon_processing.gif) no-repeat 47% 47%; | ||||
| cursor:wait; | ||||
| text-indent:-9999px; | ||||
| } | ||||
|  | ||||
| #content, | ||||
| #site_nav_local_views .nav, | ||||
| #site_nav_local_views a, | ||||
| #aside_primary { | ||||
| border-color:#fff; | ||||
| } | ||||
| #content, | ||||
| #site_nav_local_views .current a { | ||||
| background-color:transparent; | ||||
| /*background-color:red;*/ | ||||
| } | ||||
|  | ||||
| #site_nav_local_views .current a { | ||||
| background-color:transparent; | ||||
| } | ||||
|  | ||||
| #site_nav_local_views a { | ||||
| background-color:rgba(127, 127, 127, 0.2); | ||||
| } | ||||
| #site_nav_local_views a:hover { | ||||
| background-color:rgba(255, 255, 255, 0.8); | ||||
| } | ||||
|  | ||||
| .error { | ||||
| background-color:#F7E8E8; | ||||
| } | ||||
| .success { | ||||
| background-color:#EFF3DC; | ||||
| } | ||||
|  | ||||
| #anon_notice { | ||||
| background-color:rgba(206, 225, 233, 0.7); | ||||
| color:#fff; | ||||
| border-color:#fff; | ||||
| } | ||||
|  | ||||
| #showstream #anon_notice { | ||||
| background-color:rgba(155, 180, 62, 0.7); | ||||
| } | ||||
|  | ||||
| #export_data li a { | ||||
| background-repeat:no-repeat; | ||||
| background-position:0 45%; | ||||
| } | ||||
| #export_data li a.rss { | ||||
| background-image:url(../../base/images/icons/icon_rss.png); | ||||
| } | ||||
| #export_data li a.atom { | ||||
| background-image:url(../../base/images/icons/icon_atom.png); | ||||
| } | ||||
| #export_data li a.foaf { | ||||
| background-image:url(../../base/images/icons/icon_foaf.gif); | ||||
| } | ||||
|  | ||||
| .entity_edit a, | ||||
| .entity_send-a-message a, | ||||
| .form_user_nudge input.submit, | ||||
| .form_user_block input.submit, | ||||
| .form_user_unblock input.submit, | ||||
| .entity_nudge p { | ||||
| background-position: 0 40%; | ||||
| background-repeat: no-repeat; | ||||
| background-color:transparent; | ||||
| } | ||||
| .form_group_join input.submit, | ||||
| .form_group_leave input.submit | ||||
| .form_user_subscribe input.submit, | ||||
| .form_user_unsubscribe input.submit { | ||||
| background-color:#9BB43E; | ||||
| color:#fff; | ||||
| } | ||||
| .form_user_unsubscribe input.submit, | ||||
| .form_group_leave input.submit, | ||||
| .form_user_authorization input.reject { | ||||
| background-color:#87B4C8; | ||||
| } | ||||
|  | ||||
| .entity_edit a { | ||||
| background-image:url(../../base/images/icons/twotone/green/edit.gif); | ||||
| } | ||||
| .entity_send-a-message a { | ||||
| background-image:url(../../base/images/icons/twotone/green/quote.gif); | ||||
| } | ||||
| .entity_nudge p, | ||||
| .form_user_nudge input.submit { | ||||
| background-image:url(../../base/images/icons/twotone/green/mail.gif); | ||||
| } | ||||
| .form_user_block input.submit, | ||||
| .form_user_unblock input.submit { | ||||
| background-image:url(../../base/images/icons/twotone/green/shield.gif); | ||||
| } | ||||
|  | ||||
| /* NOTICES */ | ||||
| .notices li.over { | ||||
| background-color:#fcfcfc; | ||||
| } | ||||
|  | ||||
| .notice-options .notice_reply a, | ||||
| .notice-options form input.submit { | ||||
| background-color:transparent; | ||||
| } | ||||
| .notice-options .notice_reply a { | ||||
| background:transparent url(../../base/images/icons/twotone/green/reply.gif) no-repeat 0 45%; | ||||
| } | ||||
| .notice-options form.form_favor input.submit { | ||||
| background:transparent url(../../base/images/icons/twotone/green/favourite.gif) no-repeat 0 45%; | ||||
| } | ||||
| .notice-options form.form_disfavor input.submit { | ||||
| background:transparent url(../../base/images/icons/twotone/green/disfavourite.gif) no-repeat 0 45%; | ||||
| } | ||||
| .notice-options .notice_delete a { | ||||
| background:transparent url(../../base/images/icons/twotone/green/trash.gif) no-repeat 0 45%; | ||||
| } | ||||
|  | ||||
| .notices div.entry-content, | ||||
| .notices div.notice-options { | ||||
| opacity:0.4; | ||||
| } | ||||
| .notices li.hover div.entry-content, | ||||
| .notices li.hover div.notice-options { | ||||
| opacity:1; | ||||
| } | ||||
| div.entry-content { | ||||
| color:#333; | ||||
| } | ||||
| div.notice-options a, | ||||
| div.notice-options input { | ||||
| font-family:sans-serif; | ||||
| } | ||||
| .notices li.hover { | ||||
| /*background-color:#fcfcfc;*/ | ||||
| } | ||||
| /*END: NOTICES */ | ||||
|  | ||||
| #new_group a { | ||||
| background:transparent url(../../base/images/icons/twotone/green/news.gif) no-repeat 0 45%; | ||||
| } | ||||
|  | ||||
| .pagination .nav_prev a, | ||||
| .pagination .nav_next a { | ||||
| background-repeat:no-repeat; | ||||
| border-color:#CEE1E9; | ||||
| } | ||||
| .pagination .nav_prev a { | ||||
| background-image:url(../../base/images/icons/twotone/green/arrow-left.gif); | ||||
| background-position:10% 45%; | ||||
| } | ||||
| .pagination .nav_next a { | ||||
| background-image:url(../../base/images/icons/twotone/green/arrow-right.gif); | ||||
| background-position:90% 45%; | ||||
| } | ||||
							
								
								
									
										9
									
								
								theme/otalk/css/ie.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,9 @@ | ||||
| /* IE specific styles */ | ||||
|  | ||||
| .notice-options input.submit { | ||||
| color:#fff; | ||||
| } | ||||
|  | ||||
| #site_nav_local_views a { | ||||
| background-color:#D0DFE7; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								theme/otalk/default-avatar-mini.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 646 B | 
							
								
								
									
										
											BIN
										
									
								
								theme/otalk/default-avatar-profile.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								theme/otalk/default-avatar-stream.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								theme/otalk/images/illustrations/illu_arrow-left-01.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 75 B | 
							
								
								
									
										
											BIN
										
									
								
								theme/otalk/images/illustrations/illu_pattern-01.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 3.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								theme/otalk/logo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 4.9 KiB |