forked from GNUsocial/gnu-social
		
	Merge branch '0.7.x' into 0.8.x
This commit is contained in:
		
							
								
								
									
										24
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								README
									
									
									
									
									
								
							| @@ -929,6 +929,16 @@ dupelimit: Time in which it's not OK for the same person to post the | ||||
|            same notice; default = 60 seconds. | ||||
| logo: URL of an image file to use as the logo for the site. Overrides | ||||
|       the logo in the theme, if any. | ||||
| ssl: Whether to use SSL and https:// URLs for some or all pages. | ||||
|      Possible values are 'always' (use it for all pages), 'never' | ||||
|      (don't use it for any pages), or 'sometimes' (use it for | ||||
|      sensitive pages that include passwords like login and registration, | ||||
|      but not for regular pages). Default to 'never'. | ||||
| sslserver: use an alternate server name for SSL URLs, like | ||||
|            'secure.example.org'. You should be careful to set cookie | ||||
|            parameters correctly so that both the SSL server and the | ||||
|            "normal" server can access the session cookie and | ||||
|            preferably other cookies as well. | ||||
|  | ||||
| db | ||||
| -- | ||||
| @@ -1173,6 +1183,20 @@ banned: an array of usernames and/or profile IDs of 'banned' profiles. | ||||
|         not be accepted at all. (Compare with blacklisted users above, | ||||
|         whose posts just won't show up in the public stream.) | ||||
|  | ||||
| newuser | ||||
| ------- | ||||
|  | ||||
| Options with new users. | ||||
|  | ||||
| subscribe: nickname of a user account to automatically subscribe new | ||||
|            users to. Typically this would be system account for e.g. | ||||
|            service updates or announcements. Users are able to unsub | ||||
|            if they want. Default is null; no auto subscribe. | ||||
| welcome: nickname of a user account that sends welcome messages to new | ||||
|          users. Can be the same as 'subscribe' account, although on | ||||
|          busy servers it may be a good idea to keep that one just for | ||||
|          'urgent' messages. Default is null; no message. | ||||
|  | ||||
| Troubleshooting | ||||
| =============== | ||||
|  | ||||
|   | ||||
| @@ -125,6 +125,7 @@ class NoticesearchAction extends SearchAction | ||||
|         $this->pagination($page > 1, $cnt > NOTICES_PER_PAGE, | ||||
|                           $page, 'noticesearch', array('q' => $q)); | ||||
|     } | ||||
|  | ||||
|     function isReadOnly() | ||||
|     { | ||||
|         return true; | ||||
|   | ||||
| @@ -73,11 +73,17 @@ class ShowgroupAction extends Action | ||||
|  | ||||
|     function title() | ||||
|     { | ||||
|         if (!empty($this->group->fullname)) { | ||||
|             $base = $this->group->fullname . ' (' . $this->group->nickname . ')'; | ||||
|         } else { | ||||
|             $base = $this->group->nickname; | ||||
|         } | ||||
|  | ||||
|         if ($this->page == 1) { | ||||
|             return sprintf(_("%s group"), $this->group->nickname); | ||||
|             return sprintf(_("%s group"), $base); | ||||
|         } else { | ||||
|             return sprintf(_("%s group, page %d"), | ||||
|                            $this->group->nickname, | ||||
|                            $base, | ||||
|                            $this->page); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -67,11 +67,17 @@ class ShowstreamAction extends Action | ||||
|  | ||||
|     function title() | ||||
|     { | ||||
|         if (!empty($this->profile->fullname)) { | ||||
|             $base = $this->profile->fullname . ' (' . $this->user->nickname . ') '; | ||||
|         } else { | ||||
|             $base = $this->user->nickname; | ||||
|         } | ||||
|  | ||||
|         if ($this->page == 1) { | ||||
|             return $this->user->nickname; | ||||
|             return $base; | ||||
|         } else { | ||||
|             return sprintf(_("%s, page %d"), | ||||
|                            $this->user->nickname, | ||||
|                            $base, | ||||
|                            $this->page); | ||||
|         } | ||||
|     } | ||||
| @@ -140,16 +146,6 @@ class ShowstreamAction extends Action | ||||
|         $nav->show(); | ||||
|     } | ||||
|  | ||||
|     function showPageTitle() | ||||
|     { | ||||
|         $user =& common_current_user(); | ||||
|         if ($user && ($user->id == $this->profile->id)) { | ||||
|             $this->element('h1', NULL, _("Your profile")); | ||||
|         } else { | ||||
|             $this->element('h1', NULL, sprintf(_('%s\'s profile'), $this->profile->nickname)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function showPageNoticeBlock() | ||||
|     { | ||||
|         return; | ||||
|   | ||||
							
								
								
									
										113
									
								
								classes/User.php
									
									
									
									
									
								
							
							
						
						
									
										113
									
								
								classes/User.php
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| <?php | ||||
| /* | ||||
|  * Laconica - a distributed open-source microblogging tool | ||||
|  * Copyright (C) 2008, Controlez-Vous, Inc. | ||||
|  * Copyright (C) 2008, 2009, Control Yourself, Inc. | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU Affero General Public License as published by | ||||
| @@ -17,11 +17,14 @@ | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| if (!defined('LACONICA')) { exit(1); } | ||||
| if (!defined('LACONICA')) { | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Table Definition for user | ||||
|  */ | ||||
|  | ||||
| require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | ||||
| require_once 'Validate.php'; | ||||
|  | ||||
| @@ -79,13 +82,13 @@ class User extends Memcached_DataObject | ||||
|     function isSubscribed($other) | ||||
|     { | ||||
|         assert(!is_null($other)); | ||||
|         # XXX: cache results of this query | ||||
|         // XXX: cache results of this query | ||||
|         $sub = Subscription::pkeyGet(array('subscriber' => $this->id, | ||||
|                                            'subscribed' => $other->id)); | ||||
|         return (is_null($sub)) ? false : true; | ||||
|     } | ||||
|  | ||||
|     # 'update' won't write key columns, so we have to do it ourselves. | ||||
|     // 'update' won't write key columns, so we have to do it ourselves. | ||||
|  | ||||
|     function updateKeys(&$orig) | ||||
|     { | ||||
| @@ -96,7 +99,7 @@ class User extends Memcached_DataObject | ||||
|             } | ||||
|         } | ||||
|         if (count($parts) == 0) { | ||||
|             # No changes | ||||
|             // No changes | ||||
|             return true; | ||||
|         } | ||||
|         $toupdate = implode(', ', $parts); | ||||
| @@ -117,7 +120,7 @@ class User extends Memcached_DataObject | ||||
|  | ||||
|     function allowed_nickname($nickname) | ||||
|     { | ||||
|         # XXX: should already be validated for size, content, etc. | ||||
|         // XXX: should already be validated for size, content, etc. | ||||
|         static $blacklist = array('rss', 'xrds', 'doc', 'main', | ||||
|                                   'settings', 'notice', 'user', | ||||
|                                   'search', 'avatar', 'tag', 'tags', | ||||
| @@ -147,7 +150,7 @@ class User extends Memcached_DataObject | ||||
|         $sub->subscriber = $this->id; | ||||
|         $sub->subscribed = $other->id; | ||||
|  | ||||
|         $sub->created = common_sql_now(); # current time | ||||
|         $sub->created = common_sql_now(); // current time | ||||
|  | ||||
|         if (!$sub->insert()) { | ||||
|             return false; | ||||
| @@ -173,7 +176,7 @@ class User extends Memcached_DataObject | ||||
|  | ||||
|     static function register($fields) { | ||||
|  | ||||
|         # MAGICALLY put fields into current scope | ||||
|         // MAGICALLY put fields into current scope | ||||
|  | ||||
|         extract($fields); | ||||
|  | ||||
| @@ -211,11 +214,11 @@ class User extends Memcached_DataObject | ||||
|         $user->id = $id; | ||||
|         $user->nickname = $nickname; | ||||
|  | ||||
|         if (!empty($password)) { # may not have a password for OpenID users | ||||
|         if (!empty($password)) { // may not have a password for OpenID users | ||||
|             $user->password = common_munge_password($password, $id); | ||||
|         } | ||||
|  | ||||
|         # Users who respond to invite email have proven their ownership of that address | ||||
|         // Users who respond to invite email have proven their ownership of that address | ||||
|  | ||||
|         if (!empty($code)) { | ||||
|             $invite = Invitation::staticGet($code); | ||||
| @@ -240,7 +243,7 @@ class User extends Memcached_DataObject | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         # Everyone is subscribed to themself | ||||
|         // Everyone is subscribed to themself | ||||
|  | ||||
|         $subscription = new Subscription(); | ||||
|         $subscription->subscriber = $user->id; | ||||
| @@ -273,16 +276,58 @@ class User extends Memcached_DataObject | ||||
|             $user->emailChanged(); | ||||
|         } | ||||
|  | ||||
|         // Default system subscription | ||||
|  | ||||
|         $defnick = common_config('newuser', 'default'); | ||||
|  | ||||
|         if (!empty($defnick)) { | ||||
|             $defuser = User::staticGet('nickname', $defnick); | ||||
|             if (empty($defuser)) { | ||||
|                 common_log(LOG_WARNING, sprintf("Default user %s does not exist.", $defnick), | ||||
|                            __FILE__); | ||||
|             } else { | ||||
|                 $defsub = new Subscription(); | ||||
|                 $defsub->subscriber = $user->id; | ||||
|                 $defsub->subscribed = $defuser->id; | ||||
|                 $defsub->created = $user->created; | ||||
|  | ||||
|                 $result = $defsub->insert(); | ||||
|  | ||||
|                 if (!$result) { | ||||
|                     common_log_db_error($defsub, 'INSERT', __FILE__); | ||||
|                     return false; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         $profile->query('COMMIT'); | ||||
|  | ||||
|         if ($email && !$user->email) { | ||||
|             mail_confirm_address($user, $confirm->code, $profile->nickname, $email); | ||||
|         } | ||||
|  | ||||
|         // Welcome message | ||||
|  | ||||
|         $welcome = common_config('newuser', 'welcome'); | ||||
|  | ||||
|         if (!empty($welcome)) { | ||||
|             $welcomeuser = User::staticGet('nickname', $welcome); | ||||
|             if (empty($welcomeuser)) { | ||||
|                 common_log(LOG_WARNING, sprintf("Welcome user %s does not exist.", $defnick), | ||||
|                            __FILE__); | ||||
|             } else { | ||||
|                 $notice = Notice::saveNew($welcomeuser->id, | ||||
|                                           sprintf(_('Welcome to %1$s, @%2$s!'), | ||||
|                                                   common_config('site', 'name'), | ||||
|                                                   $user->nickname), | ||||
|                                           'system'); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return $user; | ||||
|     } | ||||
|  | ||||
|     # Things we do when the email changes | ||||
|     // Things we do when the email changes | ||||
|  | ||||
|     function emailChanged() | ||||
|     { | ||||
| @@ -303,35 +348,36 @@ class User extends Memcached_DataObject | ||||
|     { | ||||
|         $cache = common_memcache(); | ||||
|  | ||||
|         # XXX: Kind of a hack. | ||||
|         // XXX: Kind of a hack. | ||||
|         if ($cache) { | ||||
|             # This is the stream of favorite notices, in rev chron | ||||
|             # order. This forces it into cache. | ||||
|             // This is the stream of favorite notices, in rev chron | ||||
|             // order. This forces it into cache. | ||||
|             $faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW); | ||||
|             $cnt = 0; | ||||
|             while ($faves->fetch()) { | ||||
|                 if ($faves->id < $notice->id) { | ||||
|                     # If we passed it, it's not a fave | ||||
|                     // If we passed it, it's not a fave | ||||
|                     return false; | ||||
|                 } else if ($faves->id == $notice->id) { | ||||
|                     # If it matches a cached notice, then it's a fave | ||||
|                     // If it matches a cached notice, then it's a fave | ||||
|                     return true; | ||||
|                 } | ||||
|                 $cnt++; | ||||
|             } | ||||
|             # If we're not past the end of the cache window, | ||||
|             # then the cache has all available faves, so this one | ||||
|             # is not a fave. | ||||
|             // If we're not past the end of the cache window, | ||||
|             // then the cache has all available faves, so this one | ||||
|             // is not a fave. | ||||
|             if ($cnt < NOTICE_CACHE_WINDOW) { | ||||
|                 return false; | ||||
|             } | ||||
|             # Otherwise, cache doesn't have all faves; | ||||
|             # fall through to the default | ||||
|             // Otherwise, cache doesn't have all faves; | ||||
|             // fall through to the default | ||||
|         } | ||||
|         $fave = Fave::pkeyGet(array('user_id' => $this->id, | ||||
|                                     'notice_id' => $notice->id)); | ||||
|         return ((is_null($fave)) ? false : true); | ||||
|     } | ||||
|  | ||||
|     function mutuallySubscribed($other) | ||||
|     { | ||||
|         return $this->isSubscribed($other) && | ||||
| @@ -340,8 +386,7 @@ class User extends Memcached_DataObject | ||||
|  | ||||
|     function mutuallySubscribedUsers() | ||||
|     { | ||||
|  | ||||
|         # 3-way join; probably should get cached | ||||
|         // 3-way join; probably should get cached | ||||
|         $UT = common_config('db','type')=='pgsql'?'"user"':'user'; | ||||
|         $qry = "SELECT $UT.* " . | ||||
|           "FROM subscription sub1 JOIN $UT ON sub1.subscribed = $UT.id " . | ||||
| @@ -390,8 +435,8 @@ class User extends Memcached_DataObject | ||||
|     { | ||||
|         $enabled = common_config('inboxes', 'enabled'); | ||||
|  | ||||
|         # Complicated code, depending on whether we support inboxes yet | ||||
|         # XXX: make this go away when inboxes become mandatory | ||||
|         // Complicated code, depending on whether we support inboxes yet | ||||
|         // XXX: make this go away when inboxes become mandatory | ||||
|  | ||||
|         if ($enabled === false || | ||||
|             ($enabled == 'transitional' && $this->inboxed == 0)) { | ||||
| @@ -407,7 +452,7 @@ class User extends Memcached_DataObject | ||||
|               'SELECT notice.* ' . | ||||
|               'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' . | ||||
|               'WHERE notice_inbox.user_id = %d '; | ||||
|             # NOTE: we override ORDER | ||||
|             // NOTE: we override ORDER | ||||
|             $order = null; | ||||
|         } | ||||
|         return Notice::getStream(sprintf($qry, $this->id), | ||||
| @@ -420,8 +465,8 @@ class User extends Memcached_DataObject | ||||
|     { | ||||
|         $cache = common_memcache(); | ||||
|         if ($cache) { | ||||
|             # Faves don't happen chronologically, so we need to blow | ||||
|             # ;last cache, too | ||||
|             // Faves don't happen chronologically, so we need to blow | ||||
|             // ;last cache, too | ||||
|             $cache->delete(common_cache_key('user:faves:'.$this->id)); | ||||
|             $cache->delete(common_cache_key('user:faves:'.$this->id).';last'); | ||||
|         } | ||||
| @@ -439,12 +484,11 @@ class User extends Memcached_DataObject | ||||
|  | ||||
|     function block($other) | ||||
|     { | ||||
|  | ||||
|         # Add a new block record | ||||
|         // Add a new block record | ||||
|  | ||||
|         $block = new Profile_block(); | ||||
|  | ||||
|         # Begin a transaction | ||||
|         // Begin a transaction | ||||
|  | ||||
|         $block->query('BEGIN'); | ||||
|  | ||||
| @@ -458,7 +502,7 @@ class User extends Memcached_DataObject | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         # Cancel their subscription, if it exists | ||||
|         // Cancel their subscription, if it exists | ||||
|  | ||||
|         $sub = Subscription::pkeyGet(array('subscriber' => $other->id, | ||||
|                                            'subscribed' => $this->id)); | ||||
| @@ -478,8 +522,7 @@ class User extends Memcached_DataObject | ||||
|  | ||||
|     function unblock($other) | ||||
|     { | ||||
|  | ||||
|         # Get the block record | ||||
|         // Get the block record | ||||
|  | ||||
|         $block = Profile_block::get($this->id, $other->id); | ||||
|  | ||||
|   | ||||
| @@ -174,3 +174,13 @@ $config['sphinx']['port'] = 3312; | ||||
| #http://taguri.org/ Examples: | ||||
| #$config['integration']['taguri'] = 'example.net,2008'; | ||||
| #$config['integration']['taguri'] = 'admin@example.net,2009-03-09' | ||||
|  | ||||
| #Don't use SSL | ||||
| #$config['site']['ssl'] = 'never'; | ||||
| #Use SSL only for sensitive pages (like login, password change) | ||||
| #$config['site']['ssl'] = 'sometimes'; | ||||
| #Use SSL for all pages | ||||
| #$config['site']['ssl'] = 'always'; | ||||
|  | ||||
| #Use a different hostname for SSL-encrypted pages | ||||
| #$config['site']['sslserver'] = 'secure.example.org'; | ||||
|   | ||||
| @@ -45,4 +45,4 @@ VALUES | ||||
|     ('twitux','Twitux','http://live.gnome.org/DanielMorales/Twitux', now()), | ||||
|     ('twitvim','TwitVim','http://vim.sourceforge.net/scripts/script.php?script_id=2204', now()), | ||||
|     ('urfastr','urfastr','http://urfastr.net/', now()), | ||||
|     ('adium', 'Adium', 'http://www.adiumx.com/', now())); | ||||
|     ('adium', 'Adium', 'http://www.adiumx.com/', now()); | ||||
|   | ||||
| @@ -241,12 +241,7 @@ class Net_URL_Mapper_Path | ||||
|         } | ||||
|         $path = '/'.trim(Net_URL::resolvePath($path), '/'); | ||||
|         if (!empty($qstring)) { | ||||
|             if (!strpos($path, '?')) { | ||||
|                 $path .= '?'; | ||||
|             } else { | ||||
|                 $path .= '&'; | ||||
|             } | ||||
| 	    $path .= http_build_query($qstring); | ||||
|             $path .= '?'.http_build_query($qstring); | ||||
|         } | ||||
|         if (!empty($anchor)) { | ||||
|             $path .= '#'.ltrim($anchor, '#'); | ||||
|   | ||||
							
								
								
									
										489
									
								
								js/jquery.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										489
									
								
								js/jquery.js
									
									
									
									
										vendored
									
									
								
							| @@ -1,13 +1,13 @@ | ||||
| /*! | ||||
|  * jQuery JavaScript Library v1.3.1 | ||||
|  * jQuery JavaScript Library v1.3.2 | ||||
|  * http://jquery.com/ | ||||
|  * | ||||
|  * Copyright (c) 2009 John Resig | ||||
|  * Dual licensed under the MIT and GPL licenses. | ||||
|  * http://docs.jquery.com/License | ||||
|  * | ||||
|  * Date: 2009-01-21 20:42:16 -0500 (Wed, 21 Jan 2009) | ||||
|  * Revision: 6158 | ||||
|  * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) | ||||
|  * Revision: 6246 | ||||
|  */ | ||||
| (function(){ | ||||
|  | ||||
| @@ -88,14 +88,16 @@ jQuery.fn = jQuery.prototype = { | ||||
| 			this.context = selector.context; | ||||
| 		} | ||||
|  | ||||
| 		return this.setArray(jQuery.makeArray(selector)); | ||||
| 		return this.setArray(jQuery.isArray( selector ) ? | ||||
| 			selector : | ||||
| 			jQuery.makeArray(selector)); | ||||
| 	}, | ||||
|  | ||||
| 	// Start with an empty selector | ||||
| 	selector: "", | ||||
|  | ||||
| 	// The current version of jQuery being used | ||||
| 	jquery: "1.3.1", | ||||
| 	jquery: "1.3.2", | ||||
|  | ||||
| 	// The number of elements contained in the matched element set | ||||
| 	size: function() { | ||||
| @@ -108,7 +110,7 @@ jQuery.fn = jQuery.prototype = { | ||||
| 		return num === undefined ? | ||||
|  | ||||
| 			// Return a 'clean' array | ||||
| 			jQuery.makeArray( this ) : | ||||
| 			Array.prototype.slice.call( this ) : | ||||
|  | ||||
| 			// Return just the object | ||||
| 			this[ num ]; | ||||
| @@ -278,23 +280,21 @@ jQuery.fn = jQuery.prototype = { | ||||
| 	}, | ||||
|  | ||||
| 	// For internal use only. | ||||
| 	// Behaves like an Array's .push method, not like a jQuery method. | ||||
| 	// Behaves like an Array's method, not like a jQuery method. | ||||
| 	push: [].push, | ||||
| 	sort: [].sort, | ||||
| 	splice: [].splice, | ||||
|  | ||||
| 	find: function( selector ) { | ||||
| 		if ( this.length === 1 && !/,/.test(selector) ) { | ||||
| 		if ( this.length === 1 ) { | ||||
| 			var ret = this.pushStack( [], "find", selector ); | ||||
| 			ret.length = 0; | ||||
| 			jQuery.find( selector, this[0], ret ); | ||||
| 			return ret; | ||||
| 		} else { | ||||
| 			var elems = jQuery.map(this, function(elem){ | ||||
| 			return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){ | ||||
| 				return jQuery.find( selector, elem ); | ||||
| 			}); | ||||
|  | ||||
| 			return this.pushStack( /[^+>] [^+>]/.test( selector ) ? | ||||
| 				jQuery.unique( elems ) : | ||||
| 				elems, "find", selector ); | ||||
| 			})), "find", selector ); | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| @@ -310,33 +310,37 @@ jQuery.fn = jQuery.prototype = { | ||||
| 				// attributes in IE that are actually only stored | ||||
| 				// as properties will not be copied (such as the | ||||
| 				// the name attribute on an input). | ||||
| 				var clone = this.cloneNode(true), | ||||
| 					container = document.createElement("div"); | ||||
| 				container.appendChild(clone); | ||||
| 				return jQuery.clean([container.innerHTML])[0]; | ||||
| 				var html = this.outerHTML; | ||||
| 				if ( !html ) { | ||||
| 					var div = this.ownerDocument.createElement("div"); | ||||
| 					div.appendChild( this.cloneNode(true) ); | ||||
| 					html = div.innerHTML; | ||||
| 				} | ||||
|  | ||||
| 				return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0]; | ||||
| 			} else | ||||
| 				return this.cloneNode(true); | ||||
| 		}); | ||||
|  | ||||
| 		// Need to set the expando to null on the cloned set if it exists | ||||
| 		// removeData doesn't work here, IE removes it from the original as well | ||||
| 		// this is primarily for IE but the data expando shouldn't be copied over in any browser | ||||
| 		var clone = ret.find("*").andSelf().each(function(){ | ||||
| 			if ( this[ expando ] !== undefined ) | ||||
| 				this[ expando ] = null; | ||||
| 		}); | ||||
|  | ||||
| 		// Copy the events from the original to the clone | ||||
| 		if ( events === true ) | ||||
| 			this.find("*").andSelf().each(function(i){ | ||||
| 				if (this.nodeType == 3) | ||||
| 					return; | ||||
| 				var events = jQuery.data( this, "events" ); | ||||
| 		if ( events === true ) { | ||||
| 			var orig = this.find("*").andSelf(), i = 0; | ||||
|  | ||||
| 				for ( var type in events ) | ||||
| 					for ( var handler in events[ type ] ) | ||||
| 						jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); | ||||
| 			ret.find("*").andSelf().each(function(){ | ||||
| 				if ( this.nodeName !== orig[i].nodeName ) | ||||
| 					return; | ||||
|  | ||||
| 				var events = jQuery.data( orig[i], "events" ); | ||||
|  | ||||
| 				for ( var type in events ) { | ||||
| 					for ( var handler in events[ type ] ) { | ||||
| 						jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				i++; | ||||
| 			}); | ||||
| 		} | ||||
|  | ||||
| 		// Return the cloned set | ||||
| 		return ret; | ||||
| @@ -355,14 +359,18 @@ jQuery.fn = jQuery.prototype = { | ||||
| 	}, | ||||
|  | ||||
| 	closest: function( selector ) { | ||||
| 		var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null; | ||||
| 		var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null, | ||||
| 			closer = 0; | ||||
|  | ||||
| 		return this.map(function(){ | ||||
| 			var cur = this; | ||||
| 			while ( cur && cur.ownerDocument ) { | ||||
| 				if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) | ||||
| 				if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) { | ||||
| 					jQuery.data(cur, "closest", closer); | ||||
| 					return cur; | ||||
| 				} | ||||
| 				cur = cur.parentNode; | ||||
| 				closer++; | ||||
| 			} | ||||
| 		}); | ||||
| 	}, | ||||
| @@ -475,7 +483,7 @@ jQuery.fn = jQuery.prototype = { | ||||
| 	html: function( value ) { | ||||
| 		return value === undefined ? | ||||
| 			(this[0] ? | ||||
| 				this[0].innerHTML : | ||||
| 				this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : | ||||
| 				null) : | ||||
| 			this.empty().append( value ); | ||||
| 	}, | ||||
| @@ -507,12 +515,12 @@ jQuery.fn = jQuery.prototype = { | ||||
| 		if ( this[0] ) { | ||||
| 			var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), | ||||
| 				scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), | ||||
| 				first = fragment.firstChild, | ||||
| 				extra = this.length > 1 ? fragment.cloneNode(true) : fragment; | ||||
| 				first = fragment.firstChild; | ||||
|  | ||||
| 			if ( first ) | ||||
| 				for ( var i = 0, l = this.length; i < l; i++ ) | ||||
| 					callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment ); | ||||
| 					callback.call( root(this[i], first), this.length > 1 || i > 0 ? | ||||
| 							fragment.cloneNode(true) : fragment ); | ||||
| 		 | ||||
| 			if ( scripts ) | ||||
| 				jQuery.each( scripts, evalScript ); | ||||
| @@ -636,9 +644,7 @@ jQuery.extend({ | ||||
|  | ||||
| 	// Evalulates a script in a global context | ||||
| 	globalEval: function( data ) { | ||||
| 		data = jQuery.trim( data ); | ||||
|  | ||||
| 		if ( data ) { | ||||
| 		if ( data && /\S/.test(data) ) { | ||||
| 			// Inspired by code by Andrea Giammarchi | ||||
| 			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html | ||||
| 			var head = document.getElementsByTagName("head")[0] || document.documentElement, | ||||
| @@ -741,26 +747,32 @@ jQuery.extend({ | ||||
| 			elem.style[ name ] = old[ name ]; | ||||
| 	}, | ||||
|  | ||||
| 	css: function( elem, name, force ) { | ||||
| 	css: function( elem, name, force, extra ) { | ||||
| 		if ( name == "width" || name == "height" ) { | ||||
| 			var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; | ||||
|  | ||||
| 			function getWH() { | ||||
| 				val = name == "width" ? elem.offsetWidth : elem.offsetHeight; | ||||
| 				var padding = 0, border = 0; | ||||
|  | ||||
| 				if ( extra === "border" ) | ||||
| 					return; | ||||
|  | ||||
| 				jQuery.each( which, function() { | ||||
| 					padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; | ||||
| 					border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; | ||||
| 					if ( !extra ) | ||||
| 						val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; | ||||
| 					if ( extra === "margin" ) | ||||
| 						val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; | ||||
| 					else | ||||
| 						val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; | ||||
| 				}); | ||||
| 				val -= Math.round(padding + border); | ||||
| 			} | ||||
|  | ||||
| 			if ( jQuery(elem).is(":visible") ) | ||||
| 			if ( elem.offsetWidth !== 0 ) | ||||
| 				getWH(); | ||||
| 			else | ||||
| 				jQuery.swap( elem, props, getWH ); | ||||
|  | ||||
| 			return Math.max(0, val); | ||||
| 			return Math.max(0, Math.round(val)); | ||||
| 		} | ||||
|  | ||||
| 		return jQuery.curCSS( elem, name, force ); | ||||
| @@ -866,7 +878,7 @@ jQuery.extend({ | ||||
| 				}); | ||||
|  | ||||
| 				// Trim whitespace, otherwise indexOf won't work as expected | ||||
| 				var tags = jQuery.trim( elem ).toLowerCase(); | ||||
| 				var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase(); | ||||
|  | ||||
| 				var wrap = | ||||
| 					// option or optgroup | ||||
| @@ -906,11 +918,12 @@ jQuery.extend({ | ||||
| 				if ( !jQuery.support.tbody ) { | ||||
|  | ||||
| 					// String was a <table>, *may* have spurious <tbody> | ||||
| 					var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ? | ||||
| 					var hasBody = /<tbody/i.test(elem), | ||||
| 						tbody = !tags.indexOf("<table") && !hasBody ? | ||||
| 							div.firstChild && div.firstChild.childNodes : | ||||
|  | ||||
| 						// String was a bare <thead> or <tfoot> | ||||
| 						wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ? | ||||
| 						wrap[1] == "<table>" && !hasBody ? | ||||
| 							div.childNodes : | ||||
| 							[]; | ||||
|  | ||||
| @@ -1189,13 +1202,16 @@ jQuery.each({ | ||||
| 	insertAfter: "after", | ||||
| 	replaceAll: "replaceWith" | ||||
| }, function(name, original){ | ||||
| 	jQuery.fn[ name ] = function() { | ||||
| 		var args = arguments; | ||||
| 	jQuery.fn[ name ] = function( selector ) { | ||||
| 		var ret = [], insert = jQuery( selector ); | ||||
|  | ||||
| 		return this.each(function(){ | ||||
| 			for ( var i = 0, length = args.length; i < length; i++ ) | ||||
| 				jQuery( args[ i ] )[ original ]( this ); | ||||
| 		}); | ||||
| 		for ( var i = 0, l = insert.length; i < l; i++ ) { | ||||
| 			var elems = (i > 0 ? this.clone(true) : this).get(); | ||||
| 			jQuery.fn[ original ].apply( jQuery(insert[i]), elems ); | ||||
| 			ret = ret.concat( elems ); | ||||
| 		} | ||||
|  | ||||
| 		return this.pushStack( ret, name, selector ); | ||||
| 	}; | ||||
| }); | ||||
|  | ||||
| @@ -1234,7 +1250,7 @@ jQuery.each({ | ||||
|  | ||||
| 	empty: function() { | ||||
| 		// Remove element nodes and prevent memory leaks | ||||
| 		jQuery( ">*", this ).remove(); | ||||
| 		jQuery(this).children().remove(); | ||||
|  | ||||
| 		// Remove any remaining nodes | ||||
| 		while ( this.firstChild ) | ||||
| @@ -1402,7 +1418,7 @@ jQuery.fn.extend({ | ||||
|  */ | ||||
| (function(){ | ||||
|  | ||||
| var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]+['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[]+)+|[>+~])(\s*,\s*)?/g, | ||||
| var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g, | ||||
| 	done = 0, | ||||
| 	toString = Object.prototype.toString; | ||||
|  | ||||
| @@ -1507,6 +1523,19 @@ var Sizzle = function(selector, context, results, seed) { | ||||
|  | ||||
| 	if ( extra ) { | ||||
| 		Sizzle( extra, context, results, seed ); | ||||
|  | ||||
| 		if ( sortOrder ) { | ||||
| 			hasDuplicate = false; | ||||
| 			results.sort(sortOrder); | ||||
|  | ||||
| 			if ( hasDuplicate ) { | ||||
| 				for ( var i = 1; i < results.length; i++ ) { | ||||
| 					if ( results[i] === results[i-1] ) { | ||||
| 						results.splice(i--, 1); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return results; | ||||
| @@ -1548,7 +1577,8 @@ Sizzle.find = function(expr, context, isXML){ | ||||
| }; | ||||
|  | ||||
| Sizzle.filter = function(expr, set, inplace, not){ | ||||
| 	var old = expr, result = [], curLoop = set, match, anyFound; | ||||
| 	var old = expr, result = [], curLoop = set, match, anyFound, | ||||
| 		isXMLFilter = set && set[0] && isXML(set[0]); | ||||
|  | ||||
| 	while ( expr && set.length ) { | ||||
| 		for ( var type in Expr.filter ) { | ||||
| @@ -1561,7 +1591,7 @@ Sizzle.filter = function(expr, set, inplace, not){ | ||||
| 				} | ||||
|  | ||||
| 				if ( Expr.preFilter[ type ] ) { | ||||
| 					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not ); | ||||
| 					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); | ||||
|  | ||||
| 					if ( !match ) { | ||||
| 						anyFound = found = true; | ||||
| @@ -1606,8 +1636,6 @@ Sizzle.filter = function(expr, set, inplace, not){ | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		expr = expr.replace(/\s*,\s*/, ""); | ||||
|  | ||||
| 		// Improper expression | ||||
| 		if ( expr == old ) { | ||||
| 			if ( anyFound == null ) { | ||||
| @@ -1645,26 +1673,33 @@ var Expr = Sizzle.selectors = { | ||||
| 		} | ||||
| 	}, | ||||
| 	relative: { | ||||
| 		"+": function(checkSet, part){ | ||||
| 			for ( var i = 0, l = checkSet.length; i < l; i++ ) { | ||||
| 				var elem = checkSet[i]; | ||||
| 				if ( elem ) { | ||||
| 					var cur = elem.previousSibling; | ||||
| 					while ( cur && cur.nodeType !== 1 ) { | ||||
| 						cur = cur.previousSibling; | ||||
| 		"+": function(checkSet, part, isXML){ | ||||
| 			var isPartStr = typeof part === "string", | ||||
| 				isTag = isPartStr && !/\W/.test(part), | ||||
| 				isPartStrNotTag = isPartStr && !isTag; | ||||
|  | ||||
| 			if ( isTag && !isXML ) { | ||||
| 				part = part.toUpperCase(); | ||||
| 			} | ||||
| 					checkSet[i] = typeof part === "string" ? | ||||
| 						cur || false : | ||||
| 						cur === part; | ||||
|  | ||||
| 			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { | ||||
| 				if ( (elem = checkSet[i]) ) { | ||||
| 					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} | ||||
|  | ||||
| 					checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ? | ||||
| 						elem || false : | ||||
| 						elem === part; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			if ( typeof part === "string" ) { | ||||
| 			if ( isPartStrNotTag ) { | ||||
| 				Sizzle.filter( part, checkSet, true ); | ||||
| 			} | ||||
| 		}, | ||||
| 		">": function(checkSet, part, isXML){ | ||||
| 			if ( typeof part === "string" && !/\W/.test(part) ) { | ||||
| 			var isPartStr = typeof part === "string"; | ||||
|  | ||||
| 			if ( isPartStr && !/\W/.test(part) ) { | ||||
| 				part = isXML ? part : part.toUpperCase(); | ||||
|  | ||||
| 				for ( var i = 0, l = checkSet.length; i < l; i++ ) { | ||||
| @@ -1678,19 +1713,19 @@ var Expr = Sizzle.selectors = { | ||||
| 				for ( var i = 0, l = checkSet.length; i < l; i++ ) { | ||||
| 					var elem = checkSet[i]; | ||||
| 					if ( elem ) { | ||||
| 						checkSet[i] = typeof part === "string" ? | ||||
| 						checkSet[i] = isPartStr ? | ||||
| 							elem.parentNode : | ||||
| 							elem.parentNode === part; | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				if ( typeof part === "string" ) { | ||||
| 				if ( isPartStr ) { | ||||
| 					Sizzle.filter( part, checkSet, true ); | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		"": function(checkSet, part, isXML){ | ||||
| 			var doneName = "done" + (done++), checkFn = dirCheck; | ||||
| 			var doneName = done++, checkFn = dirCheck; | ||||
|  | ||||
| 			if ( !part.match(/\W/) ) { | ||||
| 				var nodeCheck = part = isXML ? part : part.toUpperCase(); | ||||
| @@ -1700,7 +1735,7 @@ var Expr = Sizzle.selectors = { | ||||
| 			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); | ||||
| 		}, | ||||
| 		"~": function(checkSet, part, isXML){ | ||||
| 			var doneName = "done" + (done++), checkFn = dirCheck; | ||||
| 			var doneName = done++, checkFn = dirCheck; | ||||
|  | ||||
| 			if ( typeof part === "string" && !part.match(/\W/) ) { | ||||
| 				var nodeCheck = part = isXML ? part : part.toUpperCase(); | ||||
| @@ -1718,8 +1753,16 @@ var Expr = Sizzle.selectors = { | ||||
| 			} | ||||
| 		}, | ||||
| 		NAME: function(match, context, isXML){ | ||||
| 			if ( typeof context.getElementsByName !== "undefined" && !isXML ) { | ||||
| 				return context.getElementsByName(match[1]); | ||||
| 			if ( typeof context.getElementsByName !== "undefined" ) { | ||||
| 				var ret = [], results = context.getElementsByName(match[1]); | ||||
|  | ||||
| 				for ( var i = 0, l = results.length; i < l; i++ ) { | ||||
| 					if ( results[i].getAttribute("name") === match[1] ) { | ||||
| 						ret.push( results[i] ); | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				return ret.length === 0 ? null : ret; | ||||
| 			} | ||||
| 		}, | ||||
| 		TAG: function(match, context){ | ||||
| @@ -1727,13 +1770,16 @@ var Expr = Sizzle.selectors = { | ||||
| 		} | ||||
| 	}, | ||||
| 	preFilter: { | ||||
| 		CLASS: function(match, curLoop, inplace, result, not){ | ||||
| 		CLASS: function(match, curLoop, inplace, result, not, isXML){ | ||||
| 			match = " " + match[1].replace(/\\/g, "") + " "; | ||||
|  | ||||
| 			var elem; | ||||
| 			for ( var i = 0; (elem = curLoop[i]) != null; i++ ) { | ||||
| 			if ( isXML ) { | ||||
| 				return match; | ||||
| 			} | ||||
|  | ||||
| 			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { | ||||
| 				if ( elem ) { | ||||
| 					if ( not ^ (" " + elem.className + " ").indexOf(match) >= 0 ) { | ||||
| 					if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { | ||||
| 						if ( !inplace ) | ||||
| 							result.push( elem ); | ||||
| 					} else if ( inplace ) { | ||||
| @@ -1764,14 +1810,14 @@ var Expr = Sizzle.selectors = { | ||||
| 			} | ||||
|  | ||||
| 			// TODO: Move to normal caching system | ||||
| 			match[0] = "done" + (done++); | ||||
| 			match[0] = done++; | ||||
|  | ||||
| 			return match; | ||||
| 		}, | ||||
| 		ATTR: function(match){ | ||||
| 		ATTR: function(match, curLoop, inplace, result, not, isXML){ | ||||
| 			var name = match[1].replace(/\\/g, ""); | ||||
| 			 | ||||
| 			if ( Expr.attrMap[name] ) { | ||||
| 			if ( !isXML && Expr.attrMap[name] ) { | ||||
| 				match[1] = Expr.attrMap[name]; | ||||
| 			} | ||||
|  | ||||
| @@ -1784,7 +1830,7 @@ var Expr = Sizzle.selectors = { | ||||
| 		PSEUDO: function(match, curLoop, inplace, result, not){ | ||||
| 			if ( match[1] === "not" ) { | ||||
| 				// If we're dealing with a complex expression, or a simple one | ||||
| 				if ( match[3].match(chunker).length > 1 ) { | ||||
| 				if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) { | ||||
| 					match[3] = Sizzle(match[3], null, null, curLoop); | ||||
| 				} else { | ||||
| 					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); | ||||
| @@ -1793,7 +1839,7 @@ var Expr = Sizzle.selectors = { | ||||
| 					} | ||||
| 					return false; | ||||
| 				} | ||||
| 			} else if ( Expr.match.POS.test( match[0] ) ) { | ||||
| 			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { | ||||
| 				return true; | ||||
| 			} | ||||
| 			 | ||||
| @@ -1890,47 +1936,6 @@ var Expr = Sizzle.selectors = { | ||||
| 		} | ||||
| 	}, | ||||
| 	filter: { | ||||
| 		CHILD: function(elem, match){ | ||||
| 			var type = match[1], parent = elem.parentNode; | ||||
|  | ||||
| 			var doneName = match[0]; | ||||
| 			 | ||||
| 			if ( parent && (!parent[ doneName ] || !elem.nodeIndex) ) { | ||||
| 				var count = 1; | ||||
|  | ||||
| 				for ( var node = parent.firstChild; node; node = node.nextSibling ) { | ||||
| 					if ( node.nodeType == 1 ) { | ||||
| 						node.nodeIndex = count++; | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				parent[ doneName ] = count - 1; | ||||
| 			} | ||||
|  | ||||
| 			if ( type == "first" ) { | ||||
| 				return elem.nodeIndex == 1; | ||||
| 			} else if ( type == "last" ) { | ||||
| 				return elem.nodeIndex == parent[ doneName ]; | ||||
| 			} else if ( type == "only" ) { | ||||
| 				return parent[ doneName ] == 1; | ||||
| 			} else if ( type == "nth" ) { | ||||
| 				var add = false, first = match[2], last = match[3]; | ||||
|  | ||||
| 				if ( first == 1 && last == 0 ) { | ||||
| 					return true; | ||||
| 				} | ||||
|  | ||||
| 				if ( first == 0 ) { | ||||
| 					if ( elem.nodeIndex == last ) { | ||||
| 						add = true; | ||||
| 					} | ||||
| 				} else if ( (elem.nodeIndex - last) % first == 0 && (elem.nodeIndex - last) / first >= 0 ) { | ||||
| 					add = true; | ||||
| 				} | ||||
|  | ||||
| 				return add; | ||||
| 			} | ||||
| 		}, | ||||
| 		PSEUDO: function(elem, match, i, array){ | ||||
| 			var name = match[1], filter = Expr.filters[ name ]; | ||||
|  | ||||
| @@ -1950,6 +1955,49 @@ var Expr = Sizzle.selectors = { | ||||
| 				return true; | ||||
| 			} | ||||
| 		}, | ||||
| 		CHILD: function(elem, match){ | ||||
| 			var type = match[1], node = elem; | ||||
| 			switch (type) { | ||||
| 				case 'only': | ||||
| 				case 'first': | ||||
| 					while (node = node.previousSibling)  { | ||||
| 						if ( node.nodeType === 1 ) return false; | ||||
| 					} | ||||
| 					if ( type == 'first') return true; | ||||
| 					node = elem; | ||||
| 				case 'last': | ||||
| 					while (node = node.nextSibling)  { | ||||
| 						if ( node.nodeType === 1 ) return false; | ||||
| 					} | ||||
| 					return true; | ||||
| 				case 'nth': | ||||
| 					var first = match[2], last = match[3]; | ||||
|  | ||||
| 					if ( first == 1 && last == 0 ) { | ||||
| 						return true; | ||||
| 					} | ||||
| 					 | ||||
| 					var doneName = match[0], | ||||
| 						parent = elem.parentNode; | ||||
| 	 | ||||
| 					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { | ||||
| 						var count = 0; | ||||
| 						for ( node = parent.firstChild; node; node = node.nextSibling ) { | ||||
| 							if ( node.nodeType === 1 ) { | ||||
| 								node.nodeIndex = ++count; | ||||
| 							} | ||||
| 						}  | ||||
| 						parent.sizcache = doneName; | ||||
| 					} | ||||
| 					 | ||||
| 					var diff = elem.nodeIndex - last; | ||||
| 					if ( first == 0 ) { | ||||
| 						return diff == 0; | ||||
| 					} else { | ||||
| 						return ( diff % first == 0 && diff / first >= 0 ); | ||||
| 					} | ||||
| 			} | ||||
| 		}, | ||||
| 		ID: function(elem, match){ | ||||
| 			return elem.nodeType === 1 && elem.getAttribute("id") === match; | ||||
| 		}, | ||||
| @@ -1957,10 +2005,20 @@ var Expr = Sizzle.selectors = { | ||||
| 			return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; | ||||
| 		}, | ||||
| 		CLASS: function(elem, match){ | ||||
| 			return match.test( elem.className ); | ||||
| 			return (" " + (elem.className || elem.getAttribute("class")) + " ") | ||||
| 				.indexOf( match ) > -1; | ||||
| 		}, | ||||
| 		ATTR: function(elem, match){ | ||||
| 			var result = Expr.attrHandle[ match[1] ] ? Expr.attrHandle[ match[1] ]( elem ) : elem[ match[1] ] || elem.getAttribute( match[1] ), value = result + "", type = match[2], check = match[4]; | ||||
| 			var name = match[1], | ||||
| 				result = Expr.attrHandle[ name ] ? | ||||
| 					Expr.attrHandle[ name ]( elem ) : | ||||
| 					elem[ name ] != null ? | ||||
| 						elem[ name ] : | ||||
| 						elem.getAttribute( name ), | ||||
| 				value = result + "", | ||||
| 				type = match[2], | ||||
| 				check = match[4]; | ||||
|  | ||||
| 			return result == null ? | ||||
| 				type === "!=" : | ||||
| 				type === "=" ? | ||||
| @@ -1969,8 +2027,8 @@ var Expr = Sizzle.selectors = { | ||||
| 				value.indexOf(check) >= 0 : | ||||
| 				type === "~=" ? | ||||
| 				(" " + value + " ").indexOf(check) >= 0 : | ||||
| 				!match[4] ? | ||||
| 				result : | ||||
| 				!check ? | ||||
| 				value && result !== false : | ||||
| 				type === "!=" ? | ||||
| 				value != check : | ||||
| 				type === "^=" ? | ||||
| @@ -2036,6 +2094,39 @@ try { | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| var sortOrder; | ||||
|  | ||||
| if ( document.documentElement.compareDocumentPosition ) { | ||||
| 	sortOrder = function( a, b ) { | ||||
| 		var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; | ||||
| 		if ( ret === 0 ) { | ||||
| 			hasDuplicate = true; | ||||
| 		} | ||||
| 		return ret; | ||||
| 	}; | ||||
| } else if ( "sourceIndex" in document.documentElement ) { | ||||
| 	sortOrder = function( a, b ) { | ||||
| 		var ret = a.sourceIndex - b.sourceIndex; | ||||
| 		if ( ret === 0 ) { | ||||
| 			hasDuplicate = true; | ||||
| 		} | ||||
| 		return ret; | ||||
| 	}; | ||||
| } else if ( document.createRange ) { | ||||
| 	sortOrder = function( a, b ) { | ||||
| 		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); | ||||
| 		aRange.selectNode(a); | ||||
| 		aRange.collapse(true); | ||||
| 		bRange.selectNode(b); | ||||
| 		bRange.collapse(true); | ||||
| 		var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); | ||||
| 		if ( ret === 0 ) { | ||||
| 			hasDuplicate = true; | ||||
| 		} | ||||
| 		return ret; | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| // Check to see if the browser returns elements by name when | ||||
| // querying by getElementById (and provide a workaround) | ||||
| (function(){ | ||||
| @@ -2099,7 +2190,8 @@ try { | ||||
|  | ||||
| 	// Check to see if an attribute returns normalized href attributes | ||||
| 	div.innerHTML = "<a href='#'></a>"; | ||||
| 	if ( div.firstChild && div.firstChild.getAttribute("href") !== "#" ) { | ||||
| 	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && | ||||
| 			div.firstChild.getAttribute("href") !== "#" ) { | ||||
| 		Expr.attrHandle.href = function(elem){ | ||||
| 			return elem.getAttribute("href", 2); | ||||
| 		}; | ||||
| @@ -2136,29 +2228,50 @@ if ( document.querySelectorAll ) (function(){ | ||||
| 	Sizzle.matches = oldSizzle.matches; | ||||
| })(); | ||||
|  | ||||
| if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) { | ||||
| if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ | ||||
| 	var div = document.createElement("div"); | ||||
| 	div.innerHTML = "<div class='test e'></div><div class='test'></div>"; | ||||
|  | ||||
| 	// Opera can't find a second classname (in 9.6) | ||||
| 	if ( div.getElementsByClassName("e").length === 0 ) | ||||
| 		return; | ||||
|  | ||||
| 	// Safari caches class attributes, doesn't catch changes (in 3.2) | ||||
| 	div.lastChild.className = "e"; | ||||
|  | ||||
| 	if ( div.getElementsByClassName("e").length === 1 ) | ||||
| 		return; | ||||
|  | ||||
| 	Expr.order.splice(1, 0, "CLASS"); | ||||
| 	Expr.find.CLASS = function(match, context) { | ||||
| 	Expr.find.CLASS = function(match, context, isXML) { | ||||
| 		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { | ||||
| 			return context.getElementsByClassName(match[1]); | ||||
| 	}; | ||||
| 		} | ||||
| 	}; | ||||
| })(); | ||||
|  | ||||
| function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { | ||||
| 	var sibDir = dir == "previousSibling" && !isXML; | ||||
| 	for ( var i = 0, l = checkSet.length; i < l; i++ ) { | ||||
| 		var elem = checkSet[i]; | ||||
| 		if ( elem ) { | ||||
| 			if ( sibDir && elem.nodeType === 1 ){ | ||||
| 				elem.sizcache = doneName; | ||||
| 				elem.sizset = i; | ||||
| 			} | ||||
| 			elem = elem[dir]; | ||||
| 			var match = false; | ||||
|  | ||||
| 			while ( elem && elem.nodeType ) { | ||||
| 				var done = elem[doneName]; | ||||
| 				if ( done ) { | ||||
| 					match = checkSet[ done ]; | ||||
| 			while ( elem ) { | ||||
| 				if ( elem.sizcache === doneName ) { | ||||
| 					match = checkSet[elem.sizset]; | ||||
| 					break; | ||||
| 				} | ||||
|  | ||||
| 				if ( elem.nodeType === 1 && !isXML ) | ||||
| 					elem[doneName] = i; | ||||
| 				if ( elem.nodeType === 1 && !isXML ){ | ||||
| 					elem.sizcache = doneName; | ||||
| 					elem.sizset = i; | ||||
| 				} | ||||
|  | ||||
| 				if ( elem.nodeName === cur ) { | ||||
| 					match = elem; | ||||
| @@ -2174,22 +2287,28 @@ function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { | ||||
| } | ||||
|  | ||||
| function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { | ||||
| 	var sibDir = dir == "previousSibling" && !isXML; | ||||
| 	for ( var i = 0, l = checkSet.length; i < l; i++ ) { | ||||
| 		var elem = checkSet[i]; | ||||
| 		if ( elem ) { | ||||
| 			if ( sibDir && elem.nodeType === 1 ) { | ||||
| 				elem.sizcache = doneName; | ||||
| 				elem.sizset = i; | ||||
| 			} | ||||
| 			elem = elem[dir]; | ||||
| 			var match = false; | ||||
|  | ||||
| 			while ( elem && elem.nodeType ) { | ||||
| 				if ( elem[doneName] ) { | ||||
| 					match = checkSet[ elem[doneName] ]; | ||||
| 			while ( elem ) { | ||||
| 				if ( elem.sizcache === doneName ) { | ||||
| 					match = checkSet[elem.sizset]; | ||||
| 					break; | ||||
| 				} | ||||
|  | ||||
| 				if ( elem.nodeType === 1 ) { | ||||
| 					if ( !isXML ) | ||||
| 						elem[doneName] = i; | ||||
|  | ||||
| 					if ( !isXML ) { | ||||
| 						elem.sizcache = doneName; | ||||
| 						elem.sizset = i; | ||||
| 					} | ||||
| 					if ( typeof cur !== "string" ) { | ||||
| 						if ( elem === cur ) { | ||||
| 							match = true; | ||||
| @@ -2248,15 +2367,11 @@ jQuery.expr = Sizzle.selectors; | ||||
| jQuery.expr[":"] = jQuery.expr.filters; | ||||
|  | ||||
| Sizzle.selectors.filters.hidden = function(elem){ | ||||
| 	return "hidden" === elem.type || | ||||
| 		jQuery.css(elem, "display") === "none" || | ||||
| 		jQuery.css(elem, "visibility") === "hidden"; | ||||
| 	return elem.offsetWidth === 0 || elem.offsetHeight === 0; | ||||
| }; | ||||
|  | ||||
| Sizzle.selectors.filters.visible = function(elem){ | ||||
| 	return "hidden" !== elem.type && | ||||
| 		jQuery.css(elem, "display") !== "none" && | ||||
| 		jQuery.css(elem, "visibility") !== "hidden"; | ||||
| 	return elem.offsetWidth > 0 || elem.offsetHeight > 0; | ||||
| }; | ||||
|  | ||||
| Sizzle.selectors.filters.animated = function(elem){ | ||||
| @@ -2552,6 +2667,7 @@ jQuery.event = { | ||||
| 		var all, handlers; | ||||
|  | ||||
| 		event = arguments[0] = jQuery.event.fix( event || window.event ); | ||||
| 		event.currentTarget = this; | ||||
| 		 | ||||
| 		// Namespaced event handlers | ||||
| 		var namespaces = event.type.split("."); | ||||
| @@ -2883,9 +2999,13 @@ function liveHandler( event ){ | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| 	elems.sort(function(a,b) { | ||||
| 		return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest"); | ||||
| 	}); | ||||
| 	 | ||||
| 	jQuery.each(elems, function(){ | ||||
| 		if ( this.fn.call(this.elem, event, this.fn.data) === false ) | ||||
| 			stop = false; | ||||
| 			return (stop = false); | ||||
| 	}); | ||||
|  | ||||
| 	return stop; | ||||
| @@ -2949,7 +3069,7 @@ function bindReady(){ | ||||
|  | ||||
| 		// If IE and not an iframe | ||||
| 		// continually check to see if the document is ready | ||||
| 		if ( document.documentElement.doScroll && typeof window.frameElement === "undefined" ) (function(){ | ||||
| 		if ( document.documentElement.doScroll && window == window.top ) (function(){ | ||||
| 			if ( jQuery.isReady ) return; | ||||
|  | ||||
| 			try { | ||||
| @@ -3079,12 +3199,11 @@ jQuery( window ).bind( 'unload', function(){ | ||||
| 	// document.body must exist before we can do this | ||||
| 	jQuery(function(){ | ||||
| 		var div = document.createElement("div"); | ||||
| 		div.style.width = "1px"; | ||||
| 		div.style.paddingLeft = "1px"; | ||||
| 		div.style.width = div.style.paddingLeft = "1px"; | ||||
|  | ||||
| 		document.body.appendChild( div ); | ||||
| 		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; | ||||
| 		document.body.removeChild( div ); | ||||
| 		document.body.removeChild( div ).style.display = 'none'; | ||||
| 	}); | ||||
| })(); | ||||
|  | ||||
| @@ -3175,7 +3294,7 @@ jQuery.fn.extend({ | ||||
| 		.filter(function(){ | ||||
| 			return this.name && !this.disabled && | ||||
| 				(this.checked || /select|textarea/i.test(this.nodeName) || | ||||
| 					/text|hidden|password/i.test(this.type)); | ||||
| 					/text|hidden|password|search/i.test(this.type)); | ||||
| 		}) | ||||
| 		.map(function(i, elem){ | ||||
| 			var val = jQuery(this).val(); | ||||
| @@ -3371,6 +3490,9 @@ jQuery.extend({ | ||||
| 						done = true; | ||||
| 						success(); | ||||
| 						complete(); | ||||
|  | ||||
| 						// Handle memory leak in IE | ||||
| 						script.onload = script.onreadystatechange = null; | ||||
| 						head.removeChild( script ); | ||||
| 					} | ||||
| 				}; | ||||
| @@ -3686,10 +3808,16 @@ jQuery.fn.extend({ | ||||
| 						elemdisplay[ tagName ] = display; | ||||
| 					} | ||||
| 					 | ||||
| 					this[i].style.display = jQuery.data(this[i], "olddisplay", display); | ||||
| 					jQuery.data(this[i], "olddisplay", display); | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			// Set the display of the elements in a second loop | ||||
| 			// to avoid the constant reflow | ||||
| 			for ( var i = 0, l = this.length; i < l; i++ ){ | ||||
| 				this[i].style.display = jQuery.data(this[i], "olddisplay") || ""; | ||||
| 			} | ||||
| 			 | ||||
| 			return this; | ||||
| 		} | ||||
| 	}, | ||||
| @@ -3702,8 +3830,14 @@ jQuery.fn.extend({ | ||||
| 				var old = jQuery.data(this[i], "olddisplay"); | ||||
| 				if ( !old && old !== "none" ) | ||||
| 					jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display")); | ||||
| 			} | ||||
|  | ||||
| 			// Set the display of the elements in a second loop | ||||
| 			// to avoid the constant reflow | ||||
| 			for ( var i = 0, l = this.length; i < l; i++ ){ | ||||
| 				this[i].style.display = "none"; | ||||
| 			} | ||||
|  | ||||
| 			return this; | ||||
| 		} | ||||
| 	}, | ||||
| @@ -3915,7 +4049,7 @@ jQuery.fx.prototype = { | ||||
|  | ||||
| 		t.elem = this.elem; | ||||
|  | ||||
| 		if ( t() && jQuery.timers.push(t) == 1 ) { | ||||
| 		if ( t() && jQuery.timers.push(t) && !timerId ) { | ||||
| 			timerId = setInterval(function(){ | ||||
| 				var timers = jQuery.timers; | ||||
|  | ||||
| @@ -3925,6 +4059,7 @@ jQuery.fx.prototype = { | ||||
|  | ||||
| 				if ( !timers.length ) { | ||||
| 					clearInterval( timerId ); | ||||
| 					timerId = undefined; | ||||
| 				} | ||||
| 			}, 13); | ||||
| 		} | ||||
| @@ -4193,22 +4328,21 @@ jQuery.each( ['Left', 'Top'], function(i, name) { | ||||
| jQuery.each([ "Height", "Width" ], function(i, name){ | ||||
|  | ||||
| 	var tl = i ? "Left"  : "Top",  // top or left | ||||
| 		br = i ? "Right" : "Bottom"; // bottom or right | ||||
| 		br = i ? "Right" : "Bottom", // bottom or right | ||||
| 		lower = name.toLowerCase(); | ||||
|  | ||||
| 	// innerHeight and innerWidth | ||||
| 	jQuery.fn["inner" + name] = function(){ | ||||
| 		return this[ name.toLowerCase() ]() + | ||||
| 			num(this, "padding" + tl) + | ||||
| 			num(this, "padding" + br); | ||||
| 		return this[0] ? | ||||
| 			jQuery.css( this[0], lower, false, "padding" ) : | ||||
| 			null; | ||||
| 	}; | ||||
|  | ||||
| 	// outerHeight and outerWidth | ||||
| 	jQuery.fn["outer" + name] = function(margin) { | ||||
| 		return this["inner" + name]() + | ||||
| 			num(this, "border" + tl + "Width") + | ||||
| 			num(this, "border" + br + "Width") + | ||||
| 			(margin ? | ||||
| 				num(this, "margin" + tl) + num(this, "margin" + br) : 0); | ||||
| 		return this[0] ? | ||||
| 			jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) : | ||||
| 			null; | ||||
| 	}; | ||||
| 	 | ||||
| 	var type = name.toLowerCase(); | ||||
| @@ -4238,4 +4372,5 @@ jQuery.each([ "Height", "Width" ], function(i, name){ | ||||
| 					this.css( type, typeof size === "string" ? size : size + "px" ); | ||||
| 	}; | ||||
|  | ||||
| });})(); | ||||
| }); | ||||
| })(); | ||||
|   | ||||
							
								
								
									
										10
									
								
								js/jquery.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								js/jquery.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -161,6 +161,7 @@ $(document).ready(function(){ | ||||
| 																				$("#form_notice").addClass("warning"); | ||||
| 																				return false; | ||||
| 																		   } | ||||
| 																		   $("#form_notice").addClass("processing"); | ||||
| 																		   $("#notice_action-submit").attr("disabled", "disabled"); | ||||
| 																		   $("#notice_action-submit").addClass("disabled"); | ||||
| 																		   return true; | ||||
| @@ -179,6 +180,7 @@ $(document).ready(function(){ | ||||
| 													NoticeHover(); | ||||
| 													NoticeReply(); | ||||
| 												} | ||||
| 												$("#form_notice").removeClass("processing"); | ||||
| 												$("#notice_action-submit").removeAttr("disabled"); | ||||
| 												$("#notice_action-submit").removeClass("disabled"); | ||||
| 											 } | ||||
|   | ||||
| @@ -87,6 +87,8 @@ $config = | ||||
|               'closed' => false, | ||||
|               'inviteonly' => false, | ||||
|               'private' => false, | ||||
|               'ssl' => 'never', | ||||
|               'sslserver' => null, | ||||
|               'dupelimit' => 60), # default for same person saying the same thing | ||||
|         'syslog' => | ||||
|         array('appname' => 'laconica', # for syslog | ||||
| @@ -151,6 +153,9 @@ $config = | ||||
|         array('notify' => array()), | ||||
|         'inboxes' => | ||||
|         array('enabled' => true), # on by default for new sites | ||||
|         'newuser' => | ||||
|         array('subscribe' => null, | ||||
|               'welcome' => null), | ||||
|         ); | ||||
|  | ||||
| $config['db'] = &PEAR::getStaticProperty('DB_DataObject','options'); | ||||
|   | ||||
| @@ -179,7 +179,7 @@ function jabber_format_entry($profile, $notice) | ||||
|     $xs->elementEnd('body'); | ||||
|     $xs->elementEnd('html'); | ||||
|  | ||||
|     $html = $xs->asString(); | ||||
|     $html = $xs->getString(); | ||||
|  | ||||
|     return $html . ' ' . $entry; | ||||
| } | ||||
|   | ||||
| @@ -115,7 +115,7 @@ function get_all_languages() { | ||||
| 		'he'      => array('q' => 0.5, 'lang' => 'he_IL', 'name' => 'Hebrew', 'direction' => 'rtl'), | ||||
| 		'it'      => array('q' => 1, 'lang' => 'it_IT', 'name' => 'Italian', 'direction' => 'ltr'), | ||||
| 		'jp'      => array('q' => 0.5, 'lang' => 'ja_JP', 'name' => 'Japanese', 'direction' => 'ltr'), | ||||
| 		'ko'      => array('q' => 0.9, 'lang' => 'ko',    'name' => 'Korean', 'direction' => 'ltr'), | ||||
| 		'ko'      => array('q' => 0.9, 'lang' => 'ko_KR',    'name' => 'Korean', 'direction' => 'ltr'), | ||||
| 		'mk'      => array('q' => 0.5, 'lang' => 'mk_MK', 'name' => 'Macedonian', 'direction' => 'ltr'), | ||||
| 		'nb'      => array('q' => 0.1, 'lang' => 'nb_NO', 'name' => 'Norwegian (Bokmål)', 'direction' => 'ltr'), | ||||
| 		'no'      => array('q' => 0.1, 'lang' => 'nb_NO', 'name' => 'Norwegian (Bokmål)', 'direction' => 'ltr'), | ||||
|   | ||||
							
								
								
									
										10
									
								
								lib/mail.php
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								lib/mail.php
									
									
									
									
									
								
							| @@ -554,17 +554,19 @@ function mail_notify_fave($other, $user, $notice) | ||||
|  | ||||
|     $body = sprintf(_("%1\$s just added your notice from %2\$s". | ||||
|                       " as one of their favorites.\n\n" . | ||||
|                       "In case you forgot, you can see the text". | ||||
|                       " of your notice here:\n\n" . | ||||
|                       "The URL of your notice is:\n\n" . | ||||
|                       "%3\$s\n\n" . | ||||
|                       "You can see the list of %1\$s's favorites here:\n\n" . | ||||
|                       "The text of your notice is:\n\n" . | ||||
|                       "%4\$s\n\n" . | ||||
|                       "You can see the list of %1\$s's favorites here:\n\n" . | ||||
|                       "%5\$s\n\n" . | ||||
|                       "Faithfully yours,\n" . | ||||
|                       "%5\$s\n"), | ||||
|                       "%6\$s\n"), | ||||
|                     $bestname, | ||||
|                     common_exact_date($notice->created), | ||||
|                     common_local_url('shownotice', | ||||
|                                      array('notice' => $notice->id)), | ||||
|                     $notice->content, | ||||
|                     common_local_url('showfavorites', | ||||
|                                      array('nickname' => $user->nickname)), | ||||
|                     common_config('site', 'name')); | ||||
|   | ||||
| @@ -132,20 +132,14 @@ class MessageForm extends Form | ||||
|         $mutual_users->free(); | ||||
|         unset($mutual_users); | ||||
|  | ||||
|         $this->out->elementStart('ul', 'form_data'); | ||||
|         $this->out->elementStart('li', array('id' => 'notice_to')); | ||||
|         $this->out->dropdown('to', _('To'), $mutual, null, false, | ||||
|                              ($this->to) ? $this->to->id : null); | ||||
|         $this->out->elementEnd('li'); | ||||
|  | ||||
|         $this->out->elementStart('li', array('id' => 'notice_text')); | ||||
|         $this->out->element('textarea', array('id' => 'notice_data-text', | ||||
|                                               'cols' => 35, | ||||
|                                               'rows' => 4, | ||||
|                                               'name' => 'content'), | ||||
|                             ($this->content) ? $this->content : ''); | ||||
|         $this->out->elementEnd('li'); | ||||
|         $this->out->elementEnd('ul'); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -156,14 +150,10 @@ class MessageForm extends Form | ||||
|  | ||||
|     function formActions() | ||||
|     { | ||||
|         $this->out->elementStart('ul', 'form_actions'); | ||||
|         $this->out->elementStart('li', array('id' => 'notice_submit')); | ||||
|         $this->out->element('input', array('id' => 'notice_action-submit', | ||||
|                                            'class' => 'submit', | ||||
|                                            'name' => 'message_send', | ||||
|                                            'type' => 'submit', | ||||
|                                            'value' => _('Send'))); | ||||
|         $this->out->elementEnd('li'); | ||||
|         $this->out->elementEnd('ul'); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -134,9 +134,6 @@ class NoticeForm extends Form | ||||
|  | ||||
|     function formData() | ||||
|     { | ||||
|  | ||||
|         $this->out->elementStart('ul', 'form_data'); | ||||
|         $this->out->elementStart('li', array('id' => 'notice_text')); | ||||
|         $this->out->element('label', array('for' => 'notice_data-text'), | ||||
|                             sprintf(_('What\'s up, %s?'), $this->user->nickname)); | ||||
|         // XXX: vary by defined max size | ||||
| @@ -145,8 +142,6 @@ class NoticeForm extends Form | ||||
|                                               'rows' => 4, | ||||
|                                               'name' => 'status_textarea'), | ||||
|                             ($this->content) ? $this->content : ''); | ||||
|         $this->out->elementEnd('li'); | ||||
|         $this->out->elementEnd('ul'); | ||||
|  | ||||
|         $this->out->elementStart('dl', 'form_note'); | ||||
|         $this->out->element('dt', null, _('Available characters')); | ||||
| @@ -168,14 +163,10 @@ class NoticeForm extends Form | ||||
|  | ||||
|     function formActions() | ||||
|     { | ||||
|         $this->out->elementStart('ul', 'form_actions'); | ||||
|         $this->out->elementStart('li', array('id' => 'notice_submit')); | ||||
|         $this->out->element('input', array('id' => 'notice_action-submit', | ||||
|                                            'class' => 'submit', | ||||
|                                            'name' => 'status_submit', | ||||
|                                            'type' => 'submit', | ||||
|                                            'value' => _('Send'))); | ||||
|         $this->out->elementEnd('li'); | ||||
|         $this->out->elementEnd('ul'); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -258,8 +258,12 @@ class NoticeListItem extends Widget | ||||
|     function showAuthor() | ||||
|     { | ||||
|         $this->out->elementStart('span', 'vcard author'); | ||||
|         $this->out->elementStart('a', array('href' => $this->profile->profileurl, | ||||
|                                             'class' => 'url')); | ||||
|         $attrs = array('href' => $this->profile->profileurl, | ||||
|                        'class' => 'url'); | ||||
|         if (!empty($this->profile->fullname)) { | ||||
|             $attrs['title'] = $this->profile->fullname . ' (' . $this->profile->nickname . ') '; | ||||
|         } | ||||
|         $this->out->elementStart('a', $attrs); | ||||
|         $this->showAvatar(); | ||||
|         $this->showNickname(); | ||||
|         $this->out->elementEnd('a'); | ||||
| @@ -387,6 +391,7 @@ class NoticeListItem extends Widget | ||||
|              case 'xmpp': | ||||
|              case 'mail': | ||||
|              case 'omb': | ||||
|              case 'system': | ||||
|              case 'api': | ||||
|                 $this->out->element('dd', null, $source_name); | ||||
|                 break; | ||||
|   | ||||
| @@ -50,7 +50,15 @@ function ping_broadcast_notice($notice) { | ||||
|                                                                    "User-Agent: Laconica/".LACONICA_VERSION."\r\n", | ||||
|                                                                    'content' => $req))); | ||||
|             $file = file_get_contents($notify_url, false, $context); | ||||
|  | ||||
|             if ($file === false || mb_strlen($file) == 0) { | ||||
|                 common_log(LOG_WARNING, | ||||
|                            "XML-RPC empty results for ping ($notify_url, $notice->id) "); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             $response = xmlrpc_decode($file); | ||||
|  | ||||
|             if (xmlrpc_is_fault($response)) { | ||||
|                 common_log(LOG_WARNING, | ||||
|                            "XML-RPC error for ping ($notify_url, $notice->id) ". | ||||
|   | ||||
| @@ -68,8 +68,8 @@ class Router | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     function initialize() { | ||||
|  | ||||
|     function initialize() | ||||
|     { | ||||
|         $m = Net_URL_Mapper::getInstance(); | ||||
|  | ||||
|         // In the "root" | ||||
| @@ -136,14 +136,17 @@ class Router | ||||
|  | ||||
|         foreach (array('group', 'people', 'notice') as $s) { | ||||
|             $m->connect('search/'.$s, array('action' => $s.'search')); | ||||
|             $m->connect('search/'.$s.'?q=:q', array('action' => $s.'search'),array('q' => '.+')); | ||||
|             $m->connect('search/'.$s.'?q=:q', | ||||
|                         array('action' => $s.'search'), | ||||
|                         array('q' => '.+')); | ||||
|         } | ||||
|  | ||||
|         // The second of these is needed to make the link work correctly | ||||
|         // when inserted into the page. The first is needed to match the | ||||
|         // route on the way in. Seems to be another Net_URL_Mapper bug to me. | ||||
|         $m->connect('search/notice/rss', array('action' => 'noticesearchrss')); | ||||
|         $m->connect('search/notice/rss?q=:q', array('action' => 'noticesearchrss'),array('q' => '.+')); | ||||
|         $m->connect('search/notice/rss?q=:q', array('action' => 'noticesearchrss'), | ||||
|                     array('q' => '.+')); | ||||
|  | ||||
|         // notice | ||||
|  | ||||
| @@ -431,8 +434,6 @@ class Router | ||||
|  | ||||
|     function build($action, $args=null, $params=null, $fragment=null) | ||||
|     { | ||||
|         if($params!=null) | ||||
| 	    common_log(LOG_DEBUG,"build: ".$action." ".print_r($args,true)." ".print_r($params,true)); | ||||
|         $action_arg = array('action' => $action); | ||||
|  | ||||
|         if ($args) { | ||||
| @@ -441,8 +442,17 @@ class Router | ||||
|             $args = $action_arg; | ||||
|         } | ||||
|  | ||||
|         if($params!=null) | ||||
| 	    common_log(LOG_DEBUG,"generate args:".print_r($args,true)); | ||||
|         return $this->m->generate($args, $params, $fragment); | ||||
|         $url = $this->m->generate($args, $params, $fragment); | ||||
|  | ||||
|         // Due to a bug in the Net_URL_Mapper code, the returned URL may | ||||
|         // contain a malformed query of the form ?p1=v1?p2=v2?p3=v3. We | ||||
|         // repair that here rather than modifying the upstream code... | ||||
|  | ||||
|         $qpos = strpos($url, '?'); | ||||
|         if ($qpos !== false) { | ||||
|             $url = substr($url, 0, $qpos+1) . | ||||
|               str_replace('?', '&', substr($url, $qpos+1)); | ||||
|         } | ||||
|         return $url; | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										47
									
								
								lib/util.php
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								lib/util.php
									
									
									
									
									
								
							| @@ -622,9 +622,13 @@ function common_at_link($sender_id, $nickname) | ||||
|             $url = $recipient->profileurl; | ||||
|         } | ||||
|         $xs = new XMLStringer(false); | ||||
|         $attrs = array('href' => $url, | ||||
|                        'class' => 'url'); | ||||
|         if (!empty($recipient->fullname)) { | ||||
|             $attrs['title'] = $recipient->fullname . ' (' . $recipient->nickname . ')'; | ||||
|         } | ||||
|         $xs->elementStart('span', 'vcard'); | ||||
|         $xs->elementStart('a', array('href' => $url, | ||||
|                                      'class' => 'url')); | ||||
|         $xs->elementStart('a', $attrs); | ||||
|         $xs->element('span', 'fn nickname', $nickname); | ||||
|         $xs->elementEnd('a'); | ||||
|         $xs->elementEnd('span'); | ||||
| @@ -639,10 +643,14 @@ function common_group_link($sender_id, $nickname) | ||||
|     $sender = Profile::staticGet($sender_id); | ||||
|     $group = User_group::staticGet('nickname', common_canonical_nickname($nickname)); | ||||
|     if ($group && $sender->isMember($group)) { | ||||
|         $attrs = array('href' => $group->permalink(), | ||||
|                        'class' => 'url'); | ||||
|         if (!empty($group->fullname)) { | ||||
|             $attrs['title'] = $group->fullname . ' (' . $group->nickname . ')'; | ||||
|         } | ||||
|         $xs = new XMLStringer(); | ||||
|         $xs->elementStart('span', 'vcard'); | ||||
|         $xs->elementStart('a', array('href' => $group->permalink(), | ||||
|                                      'class' => 'url')); | ||||
|         $xs->elementStart('a', $attrs); | ||||
|         $xs->element('span', 'fn nickname', $nickname); | ||||
|         $xs->elementEnd('a'); | ||||
|         $xs->elementEnd('span'); | ||||
| @@ -713,25 +721,46 @@ function common_relative_profile($sender, $nickname, $dt=null) | ||||
|  | ||||
| function common_local_url($action, $args=null, $params=null, $fragment=null) | ||||
| { | ||||
|     static $sensitive = array('login', 'register', 'passwordsettings', | ||||
|                               'twittersettings', 'finishopenidlogin', | ||||
|                               'api'); | ||||
|  | ||||
|     $r = Router::get(); | ||||
|     $path = $r->build($action, $args, $params, $fragment); | ||||
|  | ||||
|     $ssl = in_array($action, $sensitive); | ||||
|  | ||||
|     if (common_config('site','fancy')) { | ||||
|         $url = common_path(mb_substr($path, 1)); | ||||
|         $url = common_path(mb_substr($path, 1), $ssl); | ||||
|     } else { | ||||
|         if (mb_strpos($path, '/index.php') === 0) { | ||||
|             $url = common_path(mb_substr($path, 1)); | ||||
|             $url = common_path(mb_substr($path, 1), $ssl); | ||||
|         } else { | ||||
|             $url = common_path('index.php'.$path); | ||||
|             $url = common_path('index.php'.$path, $ssl); | ||||
|         } | ||||
|     } | ||||
|     return $url; | ||||
| } | ||||
|  | ||||
| function common_path($relative) | ||||
| function common_path($relative, $ssl=false) | ||||
| { | ||||
|     $pathpart = (common_config('site', 'path')) ? common_config('site', 'path')."/" : ''; | ||||
|     return "http://".common_config('site', 'server').'/'.$pathpart.$relative; | ||||
|  | ||||
|     if (($ssl && (common_config('site', 'ssl') === 'sometimes')) | ||||
|         || common_config('site', 'ssl') === 'always') { | ||||
|         $proto = 'https'; | ||||
|         if (is_string(common_config('site', 'sslserver')) && | ||||
|             mb_strlen(common_config('site', 'sslserver')) > 0) { | ||||
|             $serverpart = common_config('site', 'sslserver'); | ||||
|         } else { | ||||
|             $serverpart = common_config('site', 'server'); | ||||
|         } | ||||
|     } else { | ||||
|         $proto = 'http'; | ||||
|         $serverpart = common_config('site', 'server'); | ||||
|     } | ||||
|  | ||||
|     return $proto.'://'.$serverpart.'/'.$pathpart.$relative; | ||||
| } | ||||
|  | ||||
| function common_date_string($dt) | ||||
|   | ||||
| @@ -105,12 +105,13 @@ class LinkbackPlugin extends Plugin | ||||
|             $pb = $match[1]; | ||||
|         } | ||||
|  | ||||
|         if (!empty($pb)) { | ||||
|             $this->pingback($result->final_url, $pb); | ||||
|         } else { | ||||
|             $tb = $this->getTrackback($result->body, $result->final_url); | ||||
|  | ||||
|             if (!empty($tb)) { | ||||
|                 $this->trackback($result->final_url, $tb); | ||||
|         } else if (!empty($pb)) { | ||||
|             $this->pingback($result->final_url, $pb); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return $orig; | ||||
|   | ||||
| @@ -216,6 +216,9 @@ margin-right:0; | ||||
| address .fn { | ||||
| font-weight:bold; | ||||
| } | ||||
| address img + .fn { | ||||
| display:none; | ||||
| } | ||||
|  | ||||
| #header { | ||||
| width:100%; | ||||
| @@ -421,6 +424,7 @@ padding:0; | ||||
| display:none; | ||||
| } | ||||
| #form_notice textarea { | ||||
| float:left; | ||||
| border-radius:7px; | ||||
| -moz-border-radius:7px; | ||||
| -webkit-border-radius:7px; | ||||
| @@ -431,30 +435,19 @@ padding:7px 7px 16px 7px; | ||||
| } | ||||
| #form_notice label { | ||||
| display:block; | ||||
| float:left; | ||||
| font-size:1.3em; | ||||
| margin-bottom:7px; | ||||
| } | ||||
| #form_notice .form_data li { | ||||
| float:left; | ||||
| } | ||||
|  | ||||
| #form_notice #notice_attach_file label, | ||||
| #form_notice #notice_submit label { | ||||
| display:none; | ||||
| } | ||||
|  | ||||
| #form_notice #notice_attachment { | ||||
| margin-top:25px; | ||||
| margin-left:4px; | ||||
| } | ||||
|  | ||||
| #form_notice .form_note { | ||||
| position:absolute; | ||||
| top:99px; | ||||
| right:98px; | ||||
| z-index:9; | ||||
| } | ||||
|  | ||||
| #form_notice .form_note dt { | ||||
| font-weight:bold; | ||||
| display:none; | ||||
| @@ -464,42 +457,19 @@ font-weight:bold; | ||||
| line-height:1.15; | ||||
| padding:1px 2px; | ||||
| } | ||||
|  | ||||
| #form_notice #notice_data-attach_view { | ||||
| position:absolute; | ||||
| top:25px; | ||||
| right:30px; | ||||
| margin-left:4px; | ||||
| padding:0; | ||||
| width:16px; | ||||
| height:16px; | ||||
| border:0; | ||||
| text-indent:-9999px; | ||||
| } | ||||
| #form_notice .form_actions { | ||||
| #form_notice #notice_action-submit { | ||||
| width:60px; | ||||
| padding:8px; | ||||
| position:absolute; | ||||
| bottom:0; | ||||
| right:0; | ||||
| } | ||||
| #form_notice .form_actions input.submit { | ||||
| width:60px; | ||||
| padding:8px; | ||||
| } | ||||
|  | ||||
| #form_notice li { | ||||
| margin-bottom:0; | ||||
| } | ||||
|  | ||||
| #form_notice #notice_to { | ||||
| margin-bottom:7px; | ||||
| } | ||||
|  | ||||
| #notice_to label { | ||||
| float:left; | ||||
| margin-right:18px; | ||||
| #form_notice label[for=to] { | ||||
| margin-top:11px; | ||||
| } | ||||
| #notice_to select { | ||||
| #form_notice select[id=to] { | ||||
| margin-bottom:7px; | ||||
| margin-left:18px; | ||||
| float:left; | ||||
| } | ||||
| /*end FORM NOTICE*/ | ||||
|   | ||||
| @@ -9,3 +9,6 @@ margin-left:0; | ||||
| .entity_profile .entity_depiction { | ||||
| margin-bottom:123px; | ||||
| } | ||||
| .notice div.entry-content { | ||||
| width:63%; | ||||
| } | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								theme/base/images/icons/icon_processing.gif
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								theme/base/images/icons/icon_processing.gif
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 673 B | 
| @@ -19,9 +19,6 @@ font-size:1em; | ||||
| address { | ||||
| margin-right:71px; | ||||
| } | ||||
| address .fn { | ||||
| display:none; | ||||
| } | ||||
|  | ||||
| input, textarea, select, option { | ||||
| font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; | ||||
| @@ -94,6 +91,11 @@ 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; | ||||
| } | ||||
|  | ||||
|  | ||||
| #nav_register a { | ||||
|   | ||||
| @@ -19,9 +19,6 @@ font-size:1em; | ||||
| address { | ||||
| margin-right:71px; | ||||
| } | ||||
| address .fn { | ||||
| display:none; | ||||
| } | ||||
|  | ||||
| input, textarea, select, option { | ||||
| font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; | ||||
| @@ -94,7 +91,11 @@ 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; | ||||
| } | ||||
|  | ||||
| #nav_register a { | ||||
| text-decoration:none; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user