diff --git a/app/models/person.rb b/app/models/person.rb
index d1fa5aef4..82f0c81d9 100644
--- a/app/models/person.rb
+++ b/app/models/person.rb
@@ -160,7 +160,7 @@ class Person < ActiveRecord::Base
end
def as_json(opts={})
- {:id => self.guid, :label => 'giraffes', :name => self.name, :avatar => self.profile.image_url(:thumb_small)}
+ {:id => self.guid, :name => self.name, :avatar => self.profile.image_url(:thumb_small), :url => "/people/#{self.id}"}
end
protected
diff --git a/app/views/publics/hcard.html.haml b/app/views/publics/hcard.html.haml
deleted file mode 100644
index f6e4c4408..000000000
--- a/app/views/publics/hcard.html.haml
+++ /dev/null
@@ -1,50 +0,0 @@
-#content
- %h1= @person.name
- #content_inner
- #i.entity_profile.vcard.author
- %h2 User profile
-
- %dl.entity_nickname
- %dt Nickname
- %dd
- %a.nickname.url.uid{:href=>@person.url, :rel=>'me'}= @person.name
-
- %dl.entity_given_name
- %dt First name
- %dd
- %span.given_name= @person.profile.first_name
-
- %dl.entity_family_name
- %dt Family name
- %dd
- %span.family_name= @person.profile.last_name
-
- %dl.entity_fn
- %dt Full name
- %dd
- %span.fn= @person.name
-
- %dl.entity_url
- %dt URL
- %dd
- %a#pod_location.url{:href=>@person.url, :rel=>'me'}= @person.url
-
- %dl.entity_photo
- %dt Photo
- %dd
- %img.photo.avatar{:src=>image_or_default(@person), :width=>'300px', :height=>'300px'}
-
- %dl.entity_photo_medium
- %dt Photo
- %dd
- %img.photo.avatar{:src=>image_or_default(@person, :thumb_medium), :width=>'100px', :height=>'100px'}
-
- %dl.entity_photo_small
- %dt Photo
- %dd
- %img.photo.avatar{:src=>image_or_default(@person, :thumb_small), :width=>'50px', :height=>'50px'}
-
- %dl.entity_searchable
- %dt Searchable
- %dd
- %span.searchable= @person.profile.searchable
diff --git a/config/assets.yml b/config/assets.yml
index 9bdac0a57..fd07d77ef 100644
--- a/config/assets.yml
+++ b/config/assets.yml
@@ -11,11 +11,11 @@ javascripts:
- public/javascripts/vendor/jquery.hotkeys.js
- public/javascripts/vendor/jquery.autoresize.min.js
- public/javascripts/vendor/jquery.infinitescroll.min.js
- - public/javascripts/vendor/jquery.autocomplete.js
- public/javascripts/vendor/facebox.js
- public/javascripts/vendor/timeago.js
- public/javascripts/vendor/fileuploader.js
- public/javascripts/vendor/Mustache.js
+ - public/javascripts/jquery.autocomplete-custom.js
- public/javascripts/diaspora.js
- public/javascripts/widgets/i18n.js
- public/javascripts/widgets/alert.js
diff --git a/public/javascripts/application.js b/public/javascripts/application.js
index 296b48b54..e48935afb 100644
--- a/public/javascripts/application.js
+++ b/public/javascripts/application.js
@@ -30,5 +30,8 @@ $(document).ready(function() {
$('a').live('tap',function(){
$(this).addClass('tapped');
})
+
+ // autocomplete search box
+ Search.initialize();
});
diff --git a/public/javascripts/vendor/jquery.autocomplete.js b/public/javascripts/jquery.autocomplete-custom.js
similarity index 97%
rename from public/javascripts/vendor/jquery.autocomplete.js
rename to public/javascripts/jquery.autocomplete-custom.js
index f1b2642e7..80d7779d5 100644
--- a/public/javascripts/vendor/jquery.autocomplete.js
+++ b/public/javascripts/jquery.autocomplete-custom.js
@@ -8,11 +8,11 @@
* http://www.gnu.org/licenses/gpl.html
*
* Revision: $Id: jquery.autocomplete.js 5785 2008-07-12 10:37:33Z joern.zaefferer $
- *
+ * Modified by Diaspora
*/
;(function($) {
-
+
$.fn.extend({
autocomplete: function(urlOrData, options) {
var isUrl = typeof urlOrData == "string";
@@ -22,13 +22,13 @@ $.fn.extend({
delay: isUrl ? $.Autocompleter.defaults.delay : 10,
max: options && !options.scroll ? 10 : 150
}, options);
-
+
// if highlight is set to false, replace it with a do-nothing function
options.highlight = options.highlight || function(value) { return value; };
-
+
// if the formatMatch option is not specified, then use formatItem for backwards compatibility
options.formatMatch = options.formatMatch || options.formatItem;
-
+
return this.each(function() {
new $.Autocompleter(this, options);
});
@@ -77,9 +77,9 @@ $.Autocompleter = function(input, options) {
mouseDownOnSelect: false
};
var select = $.Autocompleter.Select(options, input, selectCurrent, config);
-
+
var blockSubmit;
-
+
// prevent form submit in opera when selecting with return key
$.browser.opera && $(input.form).bind("submit.autocomplete", function() {
if (blockSubmit) {
@@ -87,13 +87,13 @@ $.Autocompleter = function(input, options) {
return false;
}
});
-
+
// only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
$input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
// track last key pressed
lastKeyPressCode = event.keyCode;
switch(event.keyCode) {
-
+
case KEY.UP:
event.preventDefault();
if ( select.visible() ) {
@@ -102,7 +102,7 @@ $.Autocompleter = function(input, options) {
onChange(0, true);
}
break;
-
+
case KEY.DOWN:
event.preventDefault();
if ( select.visible() ) {
@@ -111,7 +111,7 @@ $.Autocompleter = function(input, options) {
onChange(0, true);
}
break;
-
+
case KEY.PAGEUP:
event.preventDefault();
if ( select.visible() ) {
@@ -120,7 +120,7 @@ $.Autocompleter = function(input, options) {
onChange(0, true);
}
break;
-
+
case KEY.PAGEDOWN:
event.preventDefault();
if ( select.visible() ) {
@@ -129,7 +129,7 @@ $.Autocompleter = function(input, options) {
onChange(0, true);
}
break;
-
+
// matches also semicolon
case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
case KEY.TAB:
@@ -141,11 +141,11 @@ $.Autocompleter = function(input, options) {
return false;
}
break;
-
+
case KEY.ESC:
select.hide();
break;
-
+
default:
clearTimeout(timeout);
timeout = setTimeout(onChange, options.delay);
@@ -196,16 +196,16 @@ $.Autocompleter = function(input, options) {
$input.unbind();
$(input.form).unbind(".autocomplete");
});
-
-
+
+
function selectCurrent() {
var selected = select.selected();
if( !selected )
return false;
-
+
var v = selected.result;
previousValue = v;
-
+
if ( options.multiple ) {
var words = trimWords($input.val());
if ( words.length > 1 ) {
@@ -213,26 +213,26 @@ $.Autocompleter = function(input, options) {
}
v += options.multipleSeparator;
}
-
+
$input.val(v);
hideResultsNow();
$input.trigger("result", [selected.data, selected.value]);
return true;
}
-
+
function onChange(crap, skipPrevCheck) {
if( lastKeyPressCode == KEY.DEL ) {
select.hide();
return;
}
-
+
var currentValue = $input.val();
-
+
if ( !skipPrevCheck && currentValue == previousValue )
return;
-
+
previousValue = currentValue;
-
+
currentValue = lastWord(currentValue);
if ( currentValue.length >= options.minChars) {
$input.addClass(options.loadingClass);
@@ -244,7 +244,7 @@ $.Autocompleter = function(input, options) {
select.hide();
}
};
-
+
function trimWords(value) {
if ( !value ) {
return [""];
@@ -257,14 +257,14 @@ $.Autocompleter = function(input, options) {
});
return result;
}
-
+
function lastWord(value) {
if ( !options.multiple )
return value;
var words = trimWords(value);
return words[words.length - 1];
}
-
+
// fills in the input box w/the first match (assumed to be the best match)
// q: the term entered
// sValue: the first matching result
@@ -330,14 +330,14 @@ $.Autocompleter = function(input, options) {
success(term, data);
// if an AJAX url has been supplied, try loading the data now
} else if( (typeof options.url == "string") && (options.url.length > 0) ){
-
+
var extraParams = {
timestamp: +new Date()
};
$.each(options.extraParams, function(key, param) {
extraParams[key] = typeof param == "function" ? param() : param;
});
-
+
$.ajax({
// try to leverage ajaxQueue plugin to abort previous requests
mode: "abort",
@@ -361,7 +361,7 @@ $.Autocompleter = function(input, options) {
failure(term);
}
};
-
+
function parse(data) {
var parsed = [];
var rows = data.split("\n");
@@ -400,6 +400,7 @@ $.Autocompleter.defaults = {
extraParams: {},
selectFirst: true,
formatItem: function(row) { return row[0]; },
+ selectionChanged : function(newItem) {},
formatMatch: null,
autoFill: false,
width: 0,
@@ -416,9 +417,9 @@ $.Autocompleter.Cache = function(options) {
var data = {};
var length = 0;
-
+
function matchSubset(s, sub) {
- if (!options.matchCase)
+ if (!options.matchCase)
s = s.toLowerCase();
var i = s.indexOf(sub);
if (options.matchContains == "word"){
@@ -427,17 +428,17 @@ $.Autocompleter.Cache = function(options) {
if (i == -1) return false;
return i == 0 || options.matchContains;
};
-
+
function add(q, value) {
if (length > options.cacheLength){
flush();
}
- if (!data[q]){
+ if (!data[q]){
length++;
}
data[q] = value;
}
-
+
function populate(){
if( !options.data ) return false;
// track the matches
@@ -446,23 +447,23 @@ $.Autocompleter.Cache = function(options) {
// no url was specified, we need to adjust the cache length to make sure it fits the local data store
if( !options.url ) options.cacheLength = 1;
-
+
// track all options for minChars = 0
stMatchSets[""] = [];
-
+
// loop through the array and create a lookup structure
for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
var rawValue = options.data[i];
// if rawValue is a string, make an array otherwise just reference the array
rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
-
+
var value = options.formatMatch(rawValue, i+1, options.data.length);
if ( value === false )
continue;
-
+
var firstChar = value.charAt(0).toLowerCase();
// if no lookup array for this character exists, look it up now
- if( !stMatchSets[firstChar] )
+ if( !stMatchSets[firstChar] )
stMatchSets[firstChar] = [];
// if the match is a string
@@ -471,7 +472,7 @@ $.Autocompleter.Cache = function(options) {
data: rawValue,
result: options.formatResult && options.formatResult(rawValue) || value
};
-
+
// push the current match into the set list
stMatchSets[firstChar].push(row);
@@ -489,15 +490,15 @@ $.Autocompleter.Cache = function(options) {
add(i, value);
});
}
-
+
// populate any existing data
setTimeout(populate, 25);
-
+
function flush(){
data = {};
length = 0;
}
-
+
return {
flush: flush,
add: add,
@@ -505,7 +506,7 @@ $.Autocompleter.Cache = function(options) {
load: function(q) {
if (!options.cacheLength || !length)
return null;
- /*
+ /*
* if dealing w/local data and matchContains than we must make sure
* to loop through all the data collections looking for matches
*/
@@ -525,9 +526,9 @@ $.Autocompleter.Cache = function(options) {
}
});
}
- }
+ }
return csub;
- } else
+ } else
// if the exact item exists, use it
if (data[q]){
return data[q];
@@ -555,7 +556,7 @@ $.Autocompleter.Select = function (options, input, select, config) {
var CLASSES = {
ACTIVE: "ac_over"
};
-
+
var listItems,
active = -1,
data,
@@ -563,7 +564,7 @@ $.Autocompleter.Select = function (options, input, select, config) {
needsInit = true,
element,
list;
-
+
// Create results
function init() {
if (!needsInit)
@@ -573,11 +574,11 @@ $.Autocompleter.Select = function (options, input, select, config) {
.addClass(options.resultsClass)
.css("position", "absolute")
.appendTo(document.body);
-
+
list = $("
").appendTo(element).mouseover( function(event) {
if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
- $(target(event)).addClass(CLASSES.ACTIVE);
+ $(target(event)).addClass(CLASSES.ACTIVE);
}
}).click(function(event) {
$(target(event)).addClass(CLASSES.ACTIVE);
@@ -590,13 +591,13 @@ $.Autocompleter.Select = function (options, input, select, config) {
}).mouseup(function() {
config.mouseDownOnSelect = false;
});
-
+
if( options.width > 0 )
element.css("width", options.width);
-
+
needsInit = false;
- }
-
+ }
+
function target(event) {
var element = event.target;
while(element && element.tagName != "LI")
@@ -608,7 +609,7 @@ $.Autocompleter.Select = function (options, input, select, config) {
}
function moveSelect(step) {
- listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
+ listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
movePosition(step);
var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
if(options.scroll) {
@@ -622,8 +623,9 @@ $.Autocompleter.Select = function (options, input, select, config) {
list.scrollTop(offset);
}
}
+ options.selectionChanged(activeItem);
};
-
+
function movePosition(step) {
active += step;
if (active < 0) {
@@ -632,13 +634,13 @@ $.Autocompleter.Select = function (options, input, select, config) {
active = 0;
}
}
-
+
function limitNumberOfItems(available) {
return options.max && options.max < available
? options.max
: available;
}
-
+
function fillList() {
list.empty();
var max = limitNumberOfItems(data.length);
@@ -660,7 +662,7 @@ $.Autocompleter.Select = function (options, input, select, config) {
if ( $.fn.bgiframe )
list.bgiframe();
}
-
+
return {
display: function(d, q) {
init();
@@ -712,7 +714,7 @@ $.Autocompleter.Select = function (options, input, select, config) {
maxHeight: options.scrollHeight,
overflow: 'auto'
});
-
+
if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
var listHeight = 0;
listItems.each(function() {
@@ -725,7 +727,7 @@ $.Autocompleter.Select = function (options, input, select, config) {
listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
}
}
-
+
}
},
selected: function() {
@@ -759,4 +761,4 @@ $.Autocompleter.Selection = function(field, start, end) {
field.focus();
};
-})(jQuery);
\ No newline at end of file
+})(jQuery);
diff --git a/public/javascripts/search.js b/public/javascripts/search.js
index 698307728..83d329905 100644
--- a/public/javascripts/search.js
+++ b/public/javascripts/search.js
@@ -1,27 +1,51 @@
var Search = {
+ source : '/people.json',
+
+ selector : '#global_search input#q',
formatItem: function(row){
- return "
" + row['name'];
+ if(row['search']) {
+ return 'Search for ' + row['name'];
+ } else {
+ return "
" + row['name'];
+ }
},
formatResult: function(row){
return row['name'];
},
parse : function(data) {
- return data.map(function(person){
+ results = data.map(function(person){
return {data : person, value : person['name']}
});
+ results.push(Search.searchLinkli());
+ return results;
+ },
+ selectItemCallback : function(event, data, formatted) {
+ $(Search.selector).val(formatted);
+ window.location = data['url'];
+ },
+ options : function(){return {
+ minChars : 3,
+ max : 4,
+ formatItem : Search.formatItem,
+ formatResult : Search.formatResult,
+ parse : Search.parse,
+ };},
+
+ searchLinkli : function() {
+ var searchTerm = $(Search.selector).val();
+ return {
+ data : {
+ 'search' : true,
+ 'url' : '/people?q=' + searchTerm,
+ 'name' : searchTerm
+ },
+ value : searchTerm
+ };
+ },
+
+ initialize : function() {
+ $(Search.selector).autocomplete(Search.source, Search.options());
+ $(Search.selector).result(Search.selectItemCallback);
}
}
-$(document).ready(function() {
- $('#global_search input').autocomplete('/people.json',
- {
- minChars : 3,
- max : 8,
- autoFill : true,
- formatItem : Search.formatItem,
- formatResult : Search.formatResult,
- parse : Search.parse
- });
-});
-//$(":text, textarea").result(findValueCallback).next().click(function() { $(this).prev().search(); });
-
diff --git a/public/javascripts/vendor/jquery.autocomplete.min.js b/public/javascripts/vendor/jquery.autocomplete.min.js
deleted file mode 100644
index f9915c405..000000000
--- a/public/javascripts/vendor/jquery.autocomplete.min.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * jQuery Autocomplete plugin 1.2
- *
- * Copyright (c) 2009 Jörn Zaefferer
- *
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- *
- * With a small modifications by Alfonso Gómez-Arzola.
- * See changelog for details.
- *
- */;(function($){$.fn.extend({autocomplete:function(urlOrData,options){var isUrl=typeof urlOrData=="string";options=$.extend({},$.Autocompleter.defaults,{url:isUrl?urlOrData:null,data:isUrl?null:urlOrData,delay:isUrl?$.Autocompleter.defaults.delay:10,max:options&&!options.scroll?10:150},options);options.highlight=options.highlight||function(value){return value;};options.formatMatch=options.formatMatch||options.formatItem;return this.each(function(){new $.Autocompleter(this,options);});},result:function(handler){return this.bind("result",handler);},search:function(handler){return this.trigger("search",[handler]);},flushCache:function(){return this.trigger("flushCache");},setOptions:function(options){return this.trigger("setOptions",[options]);},unautocomplete:function(){return this.trigger("unautocomplete");}});$.Autocompleter=function(input,options){var KEY={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var $input=$(input).attr("autocomplete","off").addClass(options.inputClass);var timeout;var previousValue="";var cache=$.Autocompleter.Cache(options);var hasFocus=0;var lastKeyPressCode;var config={mouseDownOnSelect:false};var select=$.Autocompleter.Select(options,input,selectCurrent,config);var blockSubmit;$.browser.opera&&$(input.form).bind("submit.autocomplete",function(){if(blockSubmit){blockSubmit=false;return false;}});$input.bind(($.browser.opera?"keypress":"keydown")+".autocomplete",function(event){hasFocus=1;lastKeyPressCode=event.keyCode;switch(event.keyCode){case KEY.UP:if(select.visible()){event.preventDefault();select.prev();}else{onChange(0,true);}break;case KEY.DOWN:if(select.visible()){event.preventDefault();select.next();}else{onChange(0,true);}break;case KEY.PAGEUP:event.preventDefault();if(select.visible()){select.pageUp();}else{onChange(0,true);}break;case KEY.PAGEDOWN:event.preventDefault();if(select.visible()){select.pageDown();}else{onChange(0,true);}break;case options.multiple&&$.trim(options.multipleSeparator)==","&&KEY.COMMA:case KEY.TAB:case KEY.RETURN:if(selectCurrent()){event.preventDefault();blockSubmit=true;return false;}break;case KEY.ESC:select.hide();break;default:clearTimeout(timeout);timeout=setTimeout(onChange,options.delay);break;}}).focus(function(){hasFocus++;}).blur(function(){hasFocus=0;if(!config.mouseDownOnSelect){hideResults();}}).click(function(){if(hasFocus++>1&&!select.visible()){onChange(0,true);}}).bind("search",function(){var fn=(arguments.length>1)?arguments[1]:null;function findValueCallback(q,data){var result;if(data&&data.length){for(var i=0;i1){var seperator=options.multipleSeparator.length;var cursorAt=$(input).selection().start;var wordAt,progress=0;$.each(words,function(i,word){progress+=word.length;if(cursorAt<=progress){wordAt=i;return false;}progress+=seperator;});words[wordAt]=v;v=words.join(options.multipleSeparator);}v+=options.multipleSeparator;}$input.val(v);hideResultsNow();$input.trigger("result",[selected.data,selected.value]);return true;}function onChange(crap,skipPrevCheck){if(lastKeyPressCode==KEY.DEL){select.hide();return;}var currentValue=$input.val();if(!skipPrevCheck&¤tValue==previousValue)return;previousValue=currentValue;currentValue=lastWord(currentValue);if(currentValue.length>=options.minChars){$input.addClass(options.loadingClass);if(!options.matchCase)currentValue=currentValue.toLowerCase();request(currentValue,receiveData,hideResultsNow);}else{stopLoading();select.hide();}};function trimWords(value){if(!value)return[""];if(!options.multiple)return[$.trim(value)];return $.map(value.split(options.multipleSeparator),function(word){return $.trim(value).length?$.trim(word):null;});}function lastWord(value){if(!options.multiple)return value;var words=trimWords(value);if(words.length==1)return words[0];var cursorAt=$(input).selection().start;if(cursorAt==value.length){words=trimWords(value)}else{words=trimWords(value.replace(value.substring(cursorAt),""));}return words[words.length-1];}function autoFill(q,sValue){if(options.autoFill&&(lastWord($input.val()).toLowerCase()==q.toLowerCase())&&lastKeyPressCode!=KEY.BACKSPACE){$input.val($input.val()+sValue.substring(lastWord(previousValue).length));$(input).selection(previousValue.length,previousValue.length+sValue.length);}};function hideResults(){clearTimeout(timeout);timeout=setTimeout(hideResultsNow,200);};function hideResultsNow(){var wasVisible=select.visible();select.hide();clearTimeout(timeout);stopLoading();if(options.mustMatch){$input.search(function(result){if(!result){if(options.multiple){var words=trimWords($input.val()).slice(0,-1);$input.val(words.join(options.multipleSeparator)+(words.length?options.multipleSeparator:""));}else{$input.val("");$input.trigger("result",null);}}});}};function receiveData(q,data){if(data&&data.length&&hasFocus){stopLoading();select.display(data,q);autoFill(q,data[0].value);select.show();}else{hideResultsNow();}};function request(term,success,failure){if(!options.matchCase)term=term.toLowerCase();var data=cache.load(term);if(data&&data.length){success(term,data);}else if((typeof options.url=="string")&&(options.url.length>0)){var extraParams={timestamp:+new Date()};$.each(options.extraParams,function(key,param){extraParams[key]=typeof param=="function"?param():param;});$.ajax({mode:"abort",port:"autocomplete"+input.name,dataType:options.dataType,url:options.url,data:$.extend({q:lastWord(term),limit:options.max},extraParams),success:function(data){var parsed=options.parse&&options.parse(data)||parse(data);cache.add(term,parsed);success(term,parsed);}});}else{select.emptyList();failure(term);}};function parse(data){var parsed=[];var rows=data.split("\n");for(var i=0;i]*)("+term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"$1");},scroll:true,scrollHeight:180};$.Autocompleter.Cache=function(options){var data={};var length=0;function matchSubset(s,sub){if(!options.matchCase)s=s.toLowerCase();var i=s.indexOf(sub);if(options.matchContains=="word"){i=s.toLowerCase().search("\\b"+sub.toLowerCase());}if(i==-1)return false;return i==0||options.matchContains;};function add(q,value){if(length>options.cacheLength){flush();}if(!data[q]){length++;}data[q]=value;}function populate(){if(!options.data)return false;var stMatchSets={},nullData=0;if(!options.url)options.cacheLength=1;stMatchSets[""]=[];for(var i=0,ol=options.data.length;i0){var c=data[k];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub.push(x);}});}}return csub;}else
-if(data[q]){return data[q];}else
-if(options.matchSubset){for(var i=q.length-1;i>=options.minChars;i--){var c=data[q.substr(0,i)];if(c){var csub=[];$.each(c,function(i,x){if(matchSubset(x.value,q)){csub[csub.length]=x;}});return csub;}}}return null;}};};$.Autocompleter.Select=function(options,input,select,config){var CLASSES={ACTIVE:"ac_over"};var listItems,active=-1,data,term="",needsInit=true,element,list;function init(){if(!needsInit)return;element=$("").hide().addClass(options.resultsClass).css("position","absolute").appendTo(document.body);list=$("").appendTo(element).mouseover(function(event){if(target(event).nodeName&&target(event).nodeName.toUpperCase()=='LI'){active=$("li",list).removeClass(CLASSES.ACTIVE).index(target(event));$(target(event)).addClass(CLASSES.ACTIVE);}}).click(function(event){$(target(event)).addClass(CLASSES.ACTIVE);select();input.focus();return false;}).mousedown(function(){config.mouseDownOnSelect=true;}).mouseup(function(){config.mouseDownOnSelect=false;});if(options.width>0)element.css("width",options.width);needsInit=false;}function target(event){var element=event.target;while(element&&element.tagName!="LI")element=element.parentNode;if(!element)return[];return element;}function moveSelect(step){listItems.slice(active,active+1).removeClass(CLASSES.ACTIVE);movePosition(step);var activeItem=listItems.slice(active,active+1).addClass(CLASSES.ACTIVE);if(options.scroll){var offset=0;listItems.slice(0,active).each(function(){offset+=this.offsetHeight;});if((offset+activeItem[0].offsetHeight-list.scrollTop())>list[0].clientHeight){list.scrollTop(offset+activeItem[0].offsetHeight-list.innerHeight());}else if(offset=listItems.size()){active=0;}}function limitNumberOfItems(available){return options.max&&options.max").html(options.highlight(formatted,term)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(list)[0];$.data(li,"ac_data",data[i]);}listItems=list.find("li");if(options.selectFirst){listItems.slice(0,1).addClass(CLASSES.ACTIVE);active=0;}if($.fn.bgiframe)list.bgiframe();}return{display:function(d,q){init();data=d;term=q;fillList();},next:function(){moveSelect(1);},prev:function(){moveSelect(-1);},pageUp:function(){if(active!=0&&active-8<0){moveSelect(-active);}else{moveSelect(-8);}},pageDown:function(){if(active!=listItems.size()-1&&active+8>listItems.size()){moveSelect(listItems.size()-1-active);}else{moveSelect(8);}},hide:function(){element&&element.hide();listItems&&listItems.removeClass(CLASSES.ACTIVE);active=-1;},visible:function(){return element&&element.is(":visible");},current:function(){return this.visible()&&(listItems.filter("."+CLASSES.ACTIVE)[0]||options.selectFirst&&listItems[0]);},show:function(){var offset=$(input).offset();element.css({width:typeof options.width=="string"||options.width>0?options.width:$(input).width(),top:offset.top+input.offsetHeight,left:offset.left}).show();if(options.scroll){list.scrollTop(0);list.css({maxHeight:options.scrollHeight,overflow:'auto'});if($.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var listHeight=0;listItems.each(function(){listHeight+=this.offsetHeight;});var scrollbarsVisible=listHeight>options.scrollHeight;list.css('height',scrollbarsVisible?options.scrollHeight:listHeight);if(!scrollbarsVisible){listItems.width(list.width()-parseInt(listItems.css("padding-left"))-parseInt(listItems.css("padding-right")));}}}},selected:function(){var selected=listItems&&listItems.filter("."+CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);return selected&&selected.length&&$.data(selected[0],"ac_data");},emptyList:function(){list&&list.empty();},unbind:function(){element&&element.remove();}};};$.fn.selection=function(start,end){if(start!==undefined){return this.each(function(){if(this.createTextRange){var selRange=this.createTextRange();if(end===undefined||start==end){selRange.move("character",start);selRange.select();}else{selRange.collapse(true);selRange.moveStart("character",start);selRange.moveEnd("character",end);selRange.select();}}else if(this.setSelectionRange){this.setSelectionRange(start,end);}else if(this.selectionStart){this.selectionStart=start;this.selectionEnd=end;}});}var field=this[0];if(field.createTextRange){var range=document.selection.createRange(),orig=field.value,teststring="<->",textLength=range.text.length;range.text=teststring;var caretAt=field.value.indexOf(teststring);field.value=orig;this.selection(caretAt,caretAt+textLength);return{start:caretAt,end:caretAt+textLength}}else if(field.selectionStart!==undefined){return{start:field.selectionStart,end:field.selectionEnd}}};})(jQuery);
\ No newline at end of file
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index 9b41426ed..4c90b27e7 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -35,7 +35,7 @@ describe ApplicationHelper do
person_image_link(nil).should == ""
end
it "returns a link containing the person's photo" do
- person_image_link(@person).should include(image_or_default(@person))
+ person_image_link(@person).should include(@person.profile.image_url)
end
it "returns a link to the person's profile" do
person_image_link(@person).should include(person_path(@person))
diff --git a/spec/lib/data_conversion/import_to_mysql_spec.rb b/spec/lib/data_conversion/import_to_mysql_spec.rb
index bc54a6d9e..21286c6e3 100644
--- a/spec/lib/data_conversion/import_to_mysql_spec.rb
+++ b/spec/lib/data_conversion/import_to_mysql_spec.rb
@@ -314,7 +314,7 @@ describe DataConversion::ImportToMysql do
profile = Profile.where(:mongo_id => "4d2b6eb6cc8cb43cc2000001").first
profile.image_url_medium.should be_nil
profile.searchable.should == true
- profile.image_url.should be_nil
+ profile[:image_url].should be_nil
profile.gender.should be_nil
profile.diaspora_handle.should == profile.person.diaspora_handle
profile.last_name.should == 'weinstien'
diff --git a/spec/models/photo_spec.rb b/spec/models/photo_spec.rb
index 9eeea72ea..3b19fd145 100644
--- a/spec/models/photo_spec.rb
+++ b/spec/models/photo_spec.rb
@@ -91,7 +91,7 @@ describe Photo do
@user.profile.image_url = @photo.url(:thumb_large)
@user.person.save
@photo.destroy
- Person.find(@user.person.id).profile.image_url.should be_nil
+ Person.find(@user.person.id).profile[:image_url].should be_nil
end
it 'should not use the imported filename as the url' do