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::    wiki_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 WikiController < ApplicationController
  model   :page, :revision, :user
  before_filter :login_required, :only => [:edit]
  before_filter :admin_required, :only => [:rename, :lock]
  layout  'layout'
  helper_method :page_name
  helper_method :rev_name

  def page_name
    if params['id'].nil?
      return TWCONFIG['home_page'] || "HomePage"
    end
    URI.unescape(params['id']) =~ WIKI_LINK_PATTERN
    if $1.nil?
      flash['notice']  = "Invalid page name"
      TWCONFIG['home_page'] || "HomePage"
    else
      $1
    end
  end

  def rev_name
    params['rev']
  end

  def index
    redirect_to(:action => "show", :id => page_name)
  end

  def show
    @page = Page.find_by_name(page_name)
    redirect_to(:action => "edit", :id => page_name) && return if !@page
    if rev_name
      @revision = Revision.find(rev_name, :conditions => [ "page_id == ?", @page.id])
    else
      @revision = @page.revision
    end
  end

  def raw
    @page = Page.find_by_name(page_name)
    redirect_to(:action => "edit", :id => page_name) && return if !@page
    if rev_name
      @revision = Revision.find(rev_name, :conditions => [ "page_id == ?", @page.id])
    else
      @revision = @page.revision
    end
  end

  def edit
    @page = Page.find_by_name(page_name) || Page.new('name' => page_name, 'revision_id' => 0)
    if !admin? && @page.page_locked == 1
      flash['notice']  = 'Page locked'
      redirect_to(:action => "show", :id => page_name) && return
    end
    if rev_name
      @revision = Revision.find(rev_name, :conditions => [ "page_id == ?", @page.id])
    else
      @revision = @page.revision || Revision.new('data' => 'Describe page here')
    end
    if request.post?
      case params['commit']
      when 'Save'
        @page.save
        begin
          host = Socket.gethostbyname(request.remote_ip)[0]
        rescue
          host = request.remote_ip
        end
        @revision = Revision.new('data' => params['content'], 'user_id' => session['user']['id'],
          'page_id' => @page.id, 'ip' => request.remote_ip, 'host' => host,
                                 'comment' => params['comment']
                                 )
        @revision.save
        @page.revision_id = @revision.id
        @page.save
        flash['notice']  = "Page saved"
        redirect_to(:action => "show", :id => page_name)
      when 'Preview'
        @revision = Revision.new('data' => params['content'], 'comment' => params['comment'])
        @preview = true
        flash['notice']  = "Preview"
      when 'Cancel'
        flash['notice']  = "Edit cancelled"
        redirect_to(:action => "show", :id => page_name)
      end
    end
  end

  def recent
    # seven days
    @pages = Page.find(:all, :conditions => [ "updated_at > ?", Time.now - 60*60*24*7]).sort {|a,b| b.updated_at <=> a.updated_at}
    @title = "Pages changed in last 7 days"
  end

  def rss
    # seven days
    @pages = Page.find(:all, :conditions => [ "updated_at > ?", Time.now - 60*60*24*7]).sort {|a,b| b.updated_at <=> a.updated_at}
    @title = "Pages changed in last 7 days"
    render_without_layout
  end

  def all
    @pages = Page.find(:all).sort {|a,b| a.name <=> b.name}
    @title = "All pages"
  end

  def search
    @query = params['query']
    @results = []
    return if @query == ''
    revs = Revision.find_by_sql "select * from revisions r, pages p where p.revision_id == r.id"
    revs.each do |r|
      @results << r if r.name =~ /#{@query}/i || r.data =~ /#{@query}/i
    end
    @title = "Wiki pages found for query \"#{@query}\""
  end

  def backrefs
    @results = []
    revs = Revision.find_by_sql "select * from revisions r, pages p where p.revision_id == r.id"
    revs.each do |r|
      @results << r if r.data =~ /#{page_name}/
    end
    @title = "Back references for: #{page_name}"
  end

  def revisions
    @page = Page.find_by_name(page_name)
    @revisions = Revision.find(:all, :conditions => [ "page_id == ?", @page.id])
    @title = "Revision list"
  end

  def lock
    return if !admin?
    @page = Page.find_by_name(page_name)
    return if !@page
    @page.page_locked = @page.page_locked == 0 ? 1 : 0 # toggle
    @page.save
    redirect_to(:action => "show", :id => page_name)
  end

  def rename
    redirect_to(:action => "show", :id => page_name)
  end

end