<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>db/migrate/20090105025406_add_auto_subscribe_to_user.rb</filename>
    </added>
    <added>
      <filename>db/migrate/20090107065715_add_avatar_stuff.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/.gitignore</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/LICENSE</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/README.rdoc</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/Rakefile</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/generators/paperclip/USAGE</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/generators/paperclip/paperclip_generator.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/generators/paperclip/templates/paperclip_migration.rb.erb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/init.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/lib/paperclip.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/lib/paperclip/attachment.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/lib/paperclip/geometry.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/lib/paperclip/iostream.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/lib/paperclip/storage.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/lib/paperclip/thumbnail.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/lib/paperclip/upfile.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/paperclip.gemspec</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/shoulda_macros/paperclip.rb</filename>
    </added>
    <added>
      <filename>vendor/plugins/paperclip/tasks/paperclip_tasks.rake</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -12,4 +12,4 @@ coverage/*
 config/*.sphinx.conf
 config/deploy.rb
 .gitignore.swp
-
+public/avatars</diff>
      <filename>.gitignore</filename>
    </modified>
    <modified>
      <diff>@@ -30,7 +30,7 @@ class TopicsController &lt; ApplicationController
     @topic = current_user.topics.build(params[:topic].merge(:forum =&gt; @forum, :ip =&gt; @ip))
     @post = @topic.posts.build(params[:post].merge(:user =&gt; current_user, :ip =&gt; @ip))
     @topic.sticky = true if params[:topic][:sticky] == 1 &amp;&amp; current_user.admin?
-    @topic.subscriptions.create(:user =&gt; current_user)
+    @topic.subscriptions.build(:user =&gt; current_user) if current_user.auto_subscribe?
     if @topic.save
       flash[:notice] = t(:topic_created)
       redirect_to forum_topic_path(@topic.forum, @topic)</diff>
      <filename>app/controllers/topics_controller.rb</filename>
    </modified>
    <modified>
      <diff>@@ -28,6 +28,8 @@ class User &lt; ActiveRecord::Base
   has_many :subscribed_topics, :through =&gt; :subscriptions
   has_many :topics
   has_many :unread_messages, :class_name =&gt; &quot;Message&quot;, :foreign_key =&gt; &quot;to_id&quot;, :conditions =&gt; [&quot;to_read = ? AND to_deleted = ?&quot;, false, false]
+  
+  has_attached_file :avatar, :styles =&gt; { :thumbnail =&gt; &quot;100&gt;&quot; }
 
   belongs_to :banned_by, :class_name =&gt; &quot;User&quot;, :foreign_key =&gt; &quot;banned_by&quot;
   belongs_to :style
@@ -84,6 +86,10 @@ class User &lt; ActiveRecord::Base
     ban_time.nil? ? false : ban_time &gt; Time.now
   end
   
+  def has_avatar?
+    !avatar_file_name.blank?
+  end
+  
   # Authenticates a user by their login name and unencrypted password.  Returns the user or nil.
   def self.authenticate(login, password)
     u = find_by_login(login) # need to get the salt</diff>
      <filename>app/models/user.rb</filename>
    </modified>
    <modified>
      <diff>@@ -11,7 +11,9 @@
       &lt;% end %&gt; 
       &lt;br /&gt;
       
-      &lt;% if !@user.email.blank? %&gt;
+      &lt;% if @user.has_avatar? %&gt;
+        &lt;%= image_tag @user.avatar(:thumb) %&gt;
+      &lt;% elsif !@user.email.blank? %&gt;
         &lt;%= image_tag(&quot;http://www.gravatar.com/avatar.php?gravatar_id=&quot; + Digest::MD5.hexdigest(@user.email) + &quot;&amp;default=&quot;) %&gt;&lt;br /&gt;
       &lt;% end %&gt;
         </diff>
      <filename>app/views/admin/users/show.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -28,7 +28,9 @@
     &lt;tr&gt;
       &lt;td valign='top' width='20%'&gt;
         &lt;b&gt;&lt;%= post.user.rank %&gt;&lt;br /&gt;&lt;/b&gt;
-        &lt;% if !post.user.email.blank? %&gt;
+        &lt;% if post.user.has_avatar? %&gt;
+          &lt;%= image_tag post.user.avatar(:thumb) %&gt;
+        &lt;% elsif !post.user.email.blank? %&gt;
           &lt;%= image_tag(&quot;http://www.gravatar.com/avatar.php?gravatar_id=&quot; + Digest::MD5.hexdigest(post.user.email) + &quot;&amp;default=&quot;) %&gt;&lt;br /&gt;
         &lt;% end %&gt;
         &lt;b&gt;&lt;%= t(:Posts) %&gt;:&lt;/b&gt; &lt;%= post.user.posts.size %&gt;&lt;br /&gt;</diff>
      <filename>app/views/posts/_post.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,4 @@
-&lt;% form_for current_user do |f| %&gt;
+&lt;% form_for current_user, :html =&gt; { :multipart =&gt; true } do |f| %&gt;
   &lt;table cellspacing='0' cellpadding='2' class='action-box' width='100%'&gt;
     &lt;thead&gt;&lt;tr&gt;&lt;td colspan='2'&gt;&lt;h2&gt;&lt;%= t(:Editing_your_profile) %&gt;&lt;/h2&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;
     &lt;tbody&gt;
@@ -12,32 +12,32 @@
       &lt;/tr&gt;
       
       &lt;tr&gt;
-        &lt;td valign='top'&gt;&lt;%= f.label &quot;password&quot;, &quot;New Password&quot;  %&gt;&lt;/td&gt;
+        &lt;td valign='top'&gt;&lt;%= f.label &quot;password&quot;, t(:New_Password)  %&gt;&lt;/td&gt;
         &lt;td&gt;&lt;%= f.password_field &quot;password&quot;, :value =&gt; &quot;&quot; %&gt;&lt;/td&gt;
       &lt;/tr&gt;
       
       &lt;tr&gt;
-        &lt;td valign='top'&gt;&lt;%= f.label &quot;password_confirmation&quot;, &quot;New Password Confirmation&quot; %&gt;&lt;/td&gt;
+        &lt;td valign='top'&gt;&lt;%= f.label &quot;password_confirmation&quot;, t(:New_Password_Confirmation) %&gt;&lt;/td&gt;
         &lt;td&gt;&lt;%= f.password_field &quot;password_confirmation&quot;, :value =&gt; &quot;&quot; %&gt;&lt;/td&gt;
       &lt;/tr&gt;
       
       &lt;tr&gt;
-        &lt;td valign='top'&gt;&lt;%= f.label &quot;signature&quot; %&gt;&lt;/td&gt;
+        &lt;td valign='top'&gt;&lt;%= f.label &quot;signature&quot;, t(:Signature) %&gt;&lt;/td&gt;
         &lt;td&gt;&lt;%= f.text_area &quot;signature&quot;, :cols =&gt; 80, :rows =&gt; 5 %&gt;&lt;/td&gt;
       &lt;/tr&gt;
       
       &lt;tr&gt;
-        &lt;td valign='top'&gt;&lt;%= f.label &quot;email&quot; %&gt;&lt;/td&gt;
+        &lt;td valign='top'&gt;&lt;%= f.label &quot;email&quot;, t(:Email) %&gt;&lt;/td&gt;
         &lt;td&gt;&lt;%= f.text_field &quot;email&quot;  %&gt;&lt;/td&gt;
       &lt;/tr&gt;
       
       &lt;tr&gt;
-        &lt;td valign='top'&gt;&lt;%= f.label &quot;time_zone&quot; %&gt;&lt;/td&gt;
+        &lt;td valign='top'&gt;&lt;%= f.label &quot;time_zone&quot;, t(:Time_Zone) %&gt;&lt;/td&gt;
         &lt;td&gt;&lt;%= f.time_zone_select &quot;time_zone&quot; %&gt;&lt;/td&gt;
       &lt;/tr&gt;
       
       &lt;tr&gt;
-        &lt;td valign='top'&gt;&lt;%= f.label &quot;date_display&quot;, &quot;Date &amp;amp; Time Display&quot; %&gt;&lt;/b&gt;&lt;/td&gt;
+        &lt;td valign='top'&gt;&lt;%= f.label &quot;date_display&quot;, t(:Date_and_Time_Display) %&gt;&lt;/b&gt;&lt;/td&gt;
         &lt;td&gt;
           &lt;%= f.text_field &quot;date_display&quot;, :size =&gt; 10 %&gt; 
           &lt;%= f.text_field &quot;time_display&quot;, :size =&gt; 10 %&gt;
@@ -63,13 +63,34 @@
       &lt;/tr&gt;
       
       &lt;% if current_user.email %&gt;
-        &lt;tr&gt;&lt;td valign='top'&gt;
-          &lt;b&gt;&lt;%= t(:Current) %&gt; &lt;a href='http://gravatar.com/'&gt;&lt;%= t(:Gravatar) %&gt;&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;
+        &lt;tr&gt;
+          &lt;td valign='top'&gt;
+            &lt;b&gt;&lt;%= t(:Current) %&gt; &lt;a href='http://gravatar.com/'&gt;&lt;%= t(:Gravatar) %&gt;&lt;/a&gt;&lt;/b&gt;
+          &lt;/td&gt;
           &lt;td&gt;
             &lt;%= image_tag &quot;http://www.gravatar.com/avatar.php?gravatar_id=&quot; + Digest::MD5.hexdigest(current_user.email) %&gt;
           &lt;/td&gt;
         &lt;/tr&gt;
       &lt;% end %&gt;
+      &lt;% if current_user.has_avatar? %&gt; 
+        &lt;tr&gt;
+          &lt;td valign='top'&gt;
+            &lt;b&gt;&lt;%= t(:Current_avatar) %&gt;&lt;/b&gt;
+          &lt;/td&gt;
+          &lt;td&gt;
+            &lt;%= image_tag current_user.avatar(:thumbnail) %&gt;
+          &lt;/td&gt;
+        &lt;/tr&gt;
+      &lt;% end %&gt;
+        &lt;tr&gt;
+          &lt;td valign='top'&gt;
+            &lt;b&gt;&lt;%= t(:Upload_new_avatar) %&gt;&lt;/b&gt;
+          &lt;/td&gt;
+          &lt;td&gt;
+            &lt;%= f.file_field :avatar %&gt;
+          &lt;/td&gt;
+      
+            
     &lt;/tbody&gt;
     &lt;tfoot&gt;
       &lt;tr&gt;</diff>
      <filename>app/views/users/edit.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -11,10 +11,11 @@
   &lt;tbody&gt;
     &lt;tr&gt;
       &lt;td valign='top' width='20%'&gt;&lt;b&gt;&lt;%= @user %&gt;&lt;/b&gt;&lt;br /&gt; 
-  
-        &lt;% if !@user.email.blank? %&gt;
-              &lt;%= image_tag(&quot;http://www.gravatar.com/avatar.php?gravatar_id=&quot; + Digest::MD5.hexdigest(@user.email) + &quot;&amp;default=&quot;) %&gt;&lt;br /&gt;
-          &lt;% end %&gt;
+        &lt;% if @user.has_avatar? %&gt;
+          &lt;%= image_tag @user.avatar(:thumb) %&gt;
+        &lt;% elsif !@user.email.blank? %&gt;
+          &lt;%= image_tag(&quot;http://www.gravatar.com/avatar.php?gravatar_id=&quot; + Digest::MD5.hexdigest(@user.email) + &quot;&amp;default=&quot;) %&gt;&lt;br /&gt;
+        &lt;% end %&gt;
     
       &lt;/td&gt;
       &lt;td valign='top'&gt;</diff>
      <filename>app/views/users/show.html.erb</filename>
    </modified>
    <modified>
      <diff>@@ -159,8 +159,10 @@
    :Creating_a_rank =&gt; &quot;Creating a rank&quot;,
    :Creating_a_topic =&gt; &quot;Creating a topic&quot;,
    :Current =&gt; &quot;Current&quot;,
+   :Current_avatar =&gt; &quot;Current avatar&quot;,
    :custom_rank =&gt; &quot;custom rank&quot;,
    :Custom_Rank =&gt; &quot;Custom Rank&quot;,
+   :Date_and_Time_Display =&gt; &quot;Date and Time Display&quot;,
    :Date_joined =&gt; &quot;Date joined&quot;,
    :Delete =&gt; &quot;Delete&quot;,
    :Description =&gt; &quot;Description&quot;,
@@ -222,7 +224,7 @@
    :Last_IP =&gt; &quot;Last IP&quot;,
    :Last_Post =&gt; &quot;Last Post&quot;,
    :Last_updated =&gt; &quot;Last updated&quot;,
-   :Leave_redirect =&gt; &quot;Leave redirect?&quot;,
+   :Leave_redirect? =&gt; &quot;Leave redirect?&quot;,
    :Lock =&gt; &quot;Lock&quot;,
    :Lock_this_topic =&gt; &quot;Lock this topic&quot;,
    :Locked! =&gt; &quot;Locked!&quot;,
@@ -254,7 +256,9 @@
    :Next_post =&gt; &quot;Next post&quot;,
    :New_Category =&gt; &quot;New Category&quot;,
    :New_Forum =&gt; &quot;New Forum&quot;,
+   :New_Password =&gt; &quot;New Password&quot;,
    :New_password =&gt; &quot;New password&quot;,
+   :New_Password_Confirmation =&gt; &quot;New Password Confirmation&quot;,
    :New_Rank =&gt; &quot;New Rank&quot;,
    :New_Reply =&gt; &quot;New Reply&quot;,
    :New_subject =&gt; &quot;New subject&quot;,
@@ -339,6 +343,7 @@
    :set_by =&gt; &quot;set by&quot;,
    :Signup =&gt; &quot;Signup&quot;,
    :signature =&gt; &quot;signature&quot;,
+   :Signature =&gt; &quot;Signature&quot;,
    :silent_edit =&gt; &quot;silent edit&quot;,
    :Split =&gt; &quot;Split&quot;,
    :split_into_new_topic =&gt; &quot;Split with new topic&quot;,
@@ -357,6 +362,7 @@
    :This_post_was_edited_by =&gt; &quot;This post was edited by&quot;,
    :time_now =&gt; &quot;The time is now&quot;,
    :Time_sent =&gt; &quot;Time sent&quot;,
+   :Time_Zone =&gt; &quot;Time Zone&quot;,
    :Times_banned =&gt; &quot;Times banned&quot;,
    :times =&gt; &quot;times&quot;,
    :Timestamp =&gt; &quot;Timestamp&quot;,
@@ -367,6 +373,8 @@
    :topic_deleted =&gt; &quot;Topic has been deleted.&quot;,
    :topic_has_been_split =&gt; &quot;Topic has been split.&quot;,
    :topic_not_updated =&gt; &quot;Topic could not be updated.&quot;,
+   :topic_subscription =&gt; &quot;You have subscribed to this topic.&quot;,
+   :topic_unsubscription =&gt; &quot;You have unscribed from this topic.&quot;,
    :topic_updated =&gt; &quot;Topic was updated.&quot;,
    :topics_moved =&gt; &quot;All selected topics have been moved.&quot;,
    :topic_locked_or_unlocked =&gt; &quot;Topic has been {{status}}.&quot;,
@@ -388,6 +396,7 @@
    :Unsticky =&gt; &quot;Unsticky&quot;,
    :Unsubscribe =&gt; &quot;Unsubscribe&quot;,
    :Update =&gt; &quot;Update&quot;,
+   :Upload_new_avatar =&gt; &quot;Upload new avatar&quot;,
    :User =&gt; &quot;User&quot;,
    :user_not_found =&gt; &quot;The user you were looking for could not be found.&quot;,
    :user_should_create =&gt; &quot;Maybe you could create one.&quot;,</diff>
      <filename>config/locales/en.rb</filename>
    </modified>
    <modified>
      <diff>@@ -9,7 +9,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version =&gt; 20090105020743) do
+ActiveRecord::Schema.define(:version =&gt; 20090107065715) do
 
   create_table &quot;banned_ips&quot;, :force =&gt; true do |t|
     t.string   &quot;ip&quot;
@@ -195,6 +195,10 @@ ActiveRecord::Schema.define(:version =&gt; 20090105020743) do
     t.string   &quot;time_zone&quot;
     t.string   &quot;display_name&quot;
     t.string   &quot;permalink&quot;
+    t.boolean  &quot;auto_subscribe&quot;,                          :default =&gt; true
+    t.string   &quot;avatar_file_name&quot;
+    t.string   &quot;avatar_content_type&quot;
+    t.integer  &quot;avatar_file_size&quot;
   end
 
   add_index &quot;users&quot;, [&quot;id&quot;, &quot;user_level_id&quot;], :name =&gt; &quot;index_users_on_id_and_user_level_id&quot;</diff>
      <filename>db/schema.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,19 +1,19 @@
 class Array
   def all_previous(element, included=false)
-    (included ? self[0..index(element)] : self[0..(index(element)-1)]) if index(element) &amp;&amp; !index(element).zero? 
+    (included ? self[0..index(element)] : self[0..(index(element)-1)]) if !empty? &amp;&amp; include?(element) &amp;&amp; !index(element).zero? 
   end
   # For finding the element before another in an array.
   def previous(element)
-    self[index(element)-1] 
+    self[index(element)-1] if !empty? &amp;&amp; include?(element) &amp;&amp; !index(element).zero?
   end
   
   # For finding the element after another in an array.
   def next(element)
-    self[index(element)+1] if index(element) &amp;&amp; last != element
+    self[index(element)+1] if !empty? &amp;&amp; include?(element) &amp;&amp; last != element
   end
   
   def all_next(element, included=false)
-    (included ? self[index(element)..-1] : self[(index(element)+1)..-1]) if index(element) &amp;&amp; last != element
+    (included ? self[index(element)..-1] : self[(index(element)+1)..-1]) if !empty? &amp;&amp; include?(element) &amp;&amp; last != element
   end
 end
     </diff>
      <filename>lib/array_ext.rb</filename>
    </modified>
    <modified>
      <diff>@@ -13,10 +13,18 @@ describe Array do
     [1,2,3,4,5].previous(3).should eql(2)
   end
   
+  it &quot;should be able to find no previous element for the first&quot; do
+    [1,2,3,4,5].previous(1).should eql(nil)
+  end
+  
   it &quot;should be able to find the next element in the array&quot; do
     [1,2,3,4,5].next(3).should eql(4)
   end
   
+  it &quot;should be able to find no next element for the first&quot; do
+    [1,2,3,4,5].next(5).should eql(nil)
+  end
+  
   it &quot;should be able to find the susequent elements in an array&quot; do
     [1,2,3,4,5].all_next(3).should eql([4,5])
   end</diff>
      <filename>spec/array_ext_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>827863076a16f79b58e927d01c92538077c63dc5</id>
    </parent>
  </parents>
  <author>
    <name>Ryan Bigg</name>
    <email>radarlistener@gmail.com</email>
  </author>
  <url>http://github.com/radar/rboard/commit/c6c1e39bbe319a9a01bed2b3d9befe6222aaf299</url>
  <id>c6c1e39bbe319a9a01bed2b3d9befe6222aaf299</id>
  <committed-date>2009-01-06T23:07:07-08:00</committed-date>
  <authored-date>2009-01-06T23:07:07-08:00</authored-date>
  <message>Add support for &quot;real, hosted&quot; avatar uploading. This takes precendence over the gravatar based.

Fixed bug where calling previous on an array's first element would return the array's last element.</message>
  <tree>20b497d68e29f6817ed2861f02790729113084c7</tree>
  <committer>
    <name>Ryan Bigg</name>
    <email>radarlistener@gmail.com</email>
  </committer>
</commit>
