teensyweb/
teensyweb/app/models/
teensyweb/app/views/account/
teensyweb/app/views/layouts/
teensyweb/app/views/notifications/
teensyweb/app/views/repository/
teensyweb/config/
teensyweb/config/environments/
teensyweb/db/migrate/
teensyweb/doc/
teensyweb/lib/
teensyweb/public/images/
teensyweb/public/javascripts/
teensyweb/public/stylesheets/
teensyweb/script/
teensyweb/script/performance/
teensyweb/script/process/
teensyweb/test/
teensyweb/test/fixtures/
teensyweb/test/fixtures/notifications/
#
# file::    forum_controller.rb
# author::  Jon A. Lambert
# version:: 0.1.0
# date::    1/6/2006
#
# This source code copyright (C) 2006 by Jon A. Lambert
# All rights reserved.
#
# Released under the terms of the TeensyWeb Public License
# See LICENSE file for additional information.
#

class ForumController < ApplicationController
  before_filter :admin_required, :only => [:edit, :new, :delete, :postdelete, :topicdelete]
  before_filter :login_required, :only => [:postedit, :postnew, :postreply]

  layout  'layout'

  def index
    redirect_to :action => 'list'
  end

  def list
    @forums = Forum.find_all(nil)
    @title = "Forum list"
  end

  def new
    @title = "Create a new forum"
    if request.post?
      @forum = Forum.new('name' => params['name'], 'description' => params['description'])
      @forum.save
      redirect_to :action => 'list'
    end
  end

  def edit
    @title = "Edit forum"
    @forum = Forum.find(params['id'])
    if request.post?
      @forum.name = params['name']
      @forum.description = params['description']
      @forum.save
      redirect_to :action => 'list'
    end
  end

  def delete
    @forum = Forum.find(params['id'])
    @forum.topics.each {|t|
      t.posts.each {|p| p.destroy }
      t.destroy
    }
    @forum.destroy
    redirect_to :action => 'list'
  end

  def search
    @query = params['query']
    @results = []
    return if @query == ''
    posts = Post.find_all(nil)
    posts.each do |p|
      @results << p if p.data =~ /#{@query}/i
    end
    @title = "Posts found for query \"#{@query}\""
  end

  def topiclist
    @forum = Forum.find(params['id'])
    @topics = @forum.topics.sort {|i,j| j.updated_at <=> i.updated_at }
    @title = "Topics: #{@forum.name}"
  end

  def topicdelete
    @topic = Topic.find(params['id'])
    @forum = @topic.forum
    @posts = @topic.posts
    @posts.each {|p| p.destroy }
    @topic.destroy
    redirect_to(:action => "topiclist", :id => @forum.id)
  end

  def postlist
    @topic = Topic.find(params['id'])
    @forum = @topic.forum
    @posts = @topic.posts
    @title = "Subject: #{@topic.subject}"
  end

  def postrecent
    # two days
    @posts = Post.find(:all, :conditions => [ "updated_at > ?", Time.now - 60*60*24*2]).sort {|a,b| b.updated_at <=> a.updated_at}
    @title = "Recently posted in the last 2 days"
  end

  def rss
    # three days
    @posts = Post.find(:all, :conditions => [ "updated_at > ?", Time.now - 60*60*24*2]).sort {|a,b| b.updated_at <=> a.updated_at}
    @title = "Recently posted in the last 2 days"
    render_without_layout
  end

  def postdelete
    @post = Post.find(params['id'])
    @topic = @post.topic
    @forum = @topic.forum
    @post.destroy
    redirect_to(:action => "postlist", :id => @topic.id)
  end

  def postshow
    @post = Post.find(params['id'])
    @topic = @post.topic
    @forum = @topic.forum
    @title = "Subject: #{@topic.subject}"
  end

  def postnew
    @forum = Forum.find(params['id'])
    @topic = Topic.new
    @post = Post.new
    @title = "New post"
    if request.post?
      case params['commit']
      when 'Save'
        begin
          host = Socket.gethostbyname(request.remote_ip)[0]
        rescue
          host = request.remote_ip
        end
        @topic.subject = params['subject']
        @topic.forum_id = @forum.id
        @topic.save
        @post.data = params['content']
        @post.user_id = session['user']['id']
        @post.topic_id = @topic.id
        @post.ip = request.remote_ip
        @post.host = host
        @post.save
        flash['notice']  = "Post saved"
        redirect_to(:action => "topiclist", :id => @forum.id)
      when 'Preview'
        @topic.subject = params['subject']
        @post.data = params['content']
        @preview = true
        flash['notice']  = "Preview"
      when 'Cancel'
        flash['notice']  = "Post cancelled"
        redirect_to(:action => "topiclist", :id => @forum.id)
      end
    end
  end

  def postreply
    @replyto = Post.find(params['id'])
    @topic = @replyto.topic
    @forum = @topic.forum
    @post = Post.new
    @title = "Reply to: #{@topic.subject}"
    if request.post?
      case params['commit']
      when 'Save'
        begin
          host = Socket.gethostbyname(request.remote_ip)[0]
        rescue
          host = request.remote_ip
        end
        @post.data = params['content']
        @post.user_id = session['user']['id']
        @post.topic_id = @topic.id
        @post.ip = request.remote_ip
        @post.host = host
        @post.save
        flash['notice']  = "Post saved"
        redirect_to(:action => "postlist", :id => @topic.id)
      when 'Preview'
        @post.data = params['content']
        @preview = true
        flash['notice']  = "Preview"
      when 'Cancel'
        flash['notice']  = "Post cancelled"
        redirect_to(:action => "postlist", :id => @topic.id)
      end
    end
  end

  def postedit
    @post = Post.find(params['id'])
    @topic = @post.topic
    @forum = @topic.forum
    @title = "Edit post: #{@topic.subject}"
    if !owner?(@post.user_id)
      flash['notice']  = "Cannot edit"
      redirect_to(:action => "postlist", :id => @topic.id)
    end
    if request.post?
      case params['commit']
      when 'Save'
        begin
          host = Socket.gethostbyname(request.remote_ip)[0]
        rescue
          host = request.remote_ip
        end
        @post.data = params['content']
        @post.ip = request.remote_ip
        @post.host = host
        @post.save
        flash['notice']  = "Post saved"
        redirect_to(:action => "postlist", :id => @topic.id)
      when 'Preview'
        @post.data = params['content']
        @preview = true
        flash['notice']  = "Preview"
      when 'Cancel'
        flash['notice']  = "Post cancelled"
        redirect_to(:action => "postlist", :id => @topic.id)
      end
    end
  end

end