+ # from display name, pick up user id if one user's traces only
+ display_name = params[:display_name]
+ if target_user.nil? and display_name and display_name != ''
+ @paging_action = 'view'
+ @display_name = display_name
+ @title += " from #{@display_name}"
+ target_user = User.find(:first, :conditions => [ "display_name = ?", display_name])
+ end
+
+ opt = Hash.new
+ opt[:include] = [:user, :tags] # load users and tags from db at same time as traces
+
+ # four main cases:
+ # 1 - all traces, logged in = all public traces + all user's (i.e + all mine)
+ # 2 - all traces, not logged in = all public traces
+ # 3 - user's traces, logged in as same user = all user's traces
+ # 4 - user's traces, not logged in as that user = all user's public traces
+ if target_user.nil? # all traces
+ if @user
+ conditions = ["(public = 1 OR user_id = ?)", @user.id] #1
+ else
+ conditions = ["public = 1"] #2
+ end
+ else
+ if @user and @user.id == target_user.id
+ conditions = ["user_id = ?", @user.id] #3 (check vs user id, so no join + can't pick up non-public traces by changing name)
+ else
+ conditions = ["public = 1 AND user_id = ?", target_user.id] #4
+ end
+ end
+ conditions[0] += " AND users.display_name != ''" # users need to set display name before traces will be exposed
+
+ opt[:order] = 'timestamp DESC'
+ if params[:tag]
+ @tag = params[:tag]
+ conditions[0] += " AND gpx_file_tags.tag = ?"
+ conditions << @tag;
+ end
+
+ opt[:conditions] = conditions
+
+ # count traces using all options except limit
+ @max_trace = Trace.count(opt)
+ @max_page = Integer((@max_trace + 1) / @traces_per_page)
+
+ # last step before fetch - add paging options
+ opt[:limit] = @traces_per_page
+ if page_index > 0
+ opt[:offset] = @traces_per_page * page_index
+ end
+
+ @traces = Trace.find(:all , opt)
+
+ # put together SET of tags across traces, for related links
+ tagset = Hash.new
+ if @traces
+ @traces.each do |trace|
+ trace.tags.reload if params[:tag] # if searched by tag, ActiveRecord won't bring back other tags, so do explicitly here
+ trace.tags.each do |tag|
+ tagset[tag.tag] = tag.tag
+ end
+ end
+ end
+
+ # final helper vars for view
+ @display_name = display_name
+ @all_tags = tagset.values
+ @paging_action = paging_action # the action that paging requests should route back to, e.g. 'list' or 'mine'
+ @page = page_index + 1 # nice 1-based external page numbers