ramaze 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. data/Rakefile +1 -1
  2. data/doc/AUTHORS +2 -0
  3. data/doc/CHANGELOG +173 -0
  4. data/doc/changes.txt +4184 -0
  5. data/doc/changes.xml +4186 -0
  6. data/doc/meta/announcement.txt +22 -25
  7. data/doc/meta/internals.txt +146 -9
  8. data/examples/blog/template/index.xhtml +5 -2
  9. data/examples/fcgi.rb +13 -0
  10. data/examples/wiktacular/main.rb +8 -0
  11. data/examples/wiktacular/mkd/link/2007-07-20_19-45-51.mkd +1 -0
  12. data/examples/wiktacular/mkd/link/current.mkd +1 -0
  13. data/examples/wiktacular/mkd/main/2007-07-20_16-31-33.mkd +1 -0
  14. data/examples/wiktacular/mkd/main/2007-07-20_19-21-12.mkd +1 -0
  15. data/examples/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +2 -0
  16. data/examples/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +2 -0
  17. data/examples/wiktacular/mkd/main/current.mkd +2 -0
  18. data/examples/wiktacular/mkd/markdown/current.mkd +3 -0
  19. data/examples/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
  20. data/examples/wiktacular/mkd/testing/2007-07-20_19-43-50.mkd +3 -0
  21. data/examples/wiktacular/mkd/testing/2007-07-21_18-46-01.mkd +11 -0
  22. data/examples/wiktacular/mkd/testing/2007-07-21_18-46-32.mkd +13 -0
  23. data/examples/wiktacular/mkd/testing/2007-07-21_18-47-08.mkd +17 -0
  24. data/examples/wiktacular/mkd/testing/2007-07-21_18-47-54.mkd +17 -0
  25. data/examples/wiktacular/mkd/testing/current.mkd +17 -0
  26. data/examples/wiktacular/public/favicon.ico +0 -0
  27. data/examples/wiktacular/public/screen.css +72 -0
  28. data/examples/wiktacular/src/controller.rb +44 -0
  29. data/examples/wiktacular/src/model.rb +92 -0
  30. data/examples/wiktacular/src/page.rb +66 -0
  31. data/examples/wiktacular/template/edit.xhtml +7 -0
  32. data/examples/wiktacular/template/index.xhtml +11 -0
  33. data/examples/wiktacular/template/new.xhtml +7 -0
  34. data/lib/proto/main.rb +2 -0
  35. data/lib/proto/public/error.zmr +3 -0
  36. data/lib/proto/public/js/jquery.js +1755 -1334
  37. data/lib/proto/template/index.xhtml +2 -2
  38. data/lib/ramaze.rb +8 -3
  39. data/lib/ramaze/action/render.rb +11 -0
  40. data/lib/ramaze/adapter/base.rb +11 -7
  41. data/lib/ramaze/cache.rb +25 -10
  42. data/lib/ramaze/cache/memcached.rb +16 -1
  43. data/lib/ramaze/cache/yaml_store.rb +10 -0
  44. data/lib/ramaze/controller.rb +12 -2
  45. data/lib/ramaze/controller/error.rb +9 -3
  46. data/lib/ramaze/controller/resolve.rb +20 -18
  47. data/lib/ramaze/dispatcher.rb +13 -4
  48. data/lib/ramaze/dispatcher/action.rb +7 -3
  49. data/lib/ramaze/dispatcher/error.rb +24 -2
  50. data/lib/ramaze/dispatcher/file.rb +12 -6
  51. data/lib/ramaze/global.rb +0 -3
  52. data/lib/ramaze/global/dsl.rb +9 -0
  53. data/lib/ramaze/global/globalstruct.rb +7 -1
  54. data/lib/ramaze/helper/aspect.rb +4 -2
  55. data/lib/ramaze/helper/cgi.rb +2 -2
  56. data/lib/ramaze/helper/file.rb +3 -0
  57. data/lib/ramaze/helper/link.rb +20 -0
  58. data/lib/ramaze/helper/markaby.rb +3 -0
  59. data/lib/ramaze/helper/pager.rb +10 -17
  60. data/lib/ramaze/helper/partial.rb +9 -3
  61. data/lib/ramaze/inform/analogger.rb +14 -0
  62. data/lib/ramaze/inform/growl.rb +7 -0
  63. data/lib/ramaze/inform/hub.rb +9 -0
  64. data/lib/ramaze/inform/informer.rb +9 -3
  65. data/lib/ramaze/inform/informing.rb +9 -3
  66. data/lib/ramaze/inform/knotify.rb +5 -1
  67. data/lib/ramaze/inform/syslog.rb +3 -0
  68. data/lib/ramaze/inform/xosd.rb +12 -0
  69. data/lib/ramaze/template.rb +3 -0
  70. data/lib/ramaze/template/amrita2.rb +2 -0
  71. data/lib/ramaze/template/erubis.rb +1 -0
  72. data/lib/ramaze/template/ezamar.rb +1 -0
  73. data/lib/ramaze/template/ezamar/element.rb +17 -11
  74. data/lib/ramaze/template/ezamar/engine.rb +5 -0
  75. data/lib/ramaze/template/ezamar/render_partial.rb +4 -2
  76. data/lib/ramaze/template/haml.rb +4 -0
  77. data/lib/ramaze/template/liquid.rb +4 -0
  78. data/lib/ramaze/template/markaby.rb +4 -0
  79. data/lib/ramaze/template/remarkably.rb +4 -0
  80. data/lib/ramaze/tool.rb +10 -0
  81. data/lib/ramaze/tool/localize.rb +1 -1
  82. data/lib/ramaze/trinity/session.rb +8 -1
  83. data/lib/ramaze/version.rb +1 -1
  84. data/rake_tasks/maintaince.rake +2 -2
  85. data/spec/ramaze/action/basics.rb +1 -1
  86. data/spec/ramaze/cache.rb +11 -0
  87. data/spec/ramaze/controller.rb +0 -14
  88. data/spec/ramaze/dispatcher/file.rb +5 -5
  89. data/spec/ramaze/dispatcher/public/favicon.ico +0 -0
  90. data/spec/ramaze/dispatcher/public/test_download.css +141 -0
  91. data/spec/ramaze/error.rb +21 -7
  92. data/spec/ramaze/helper/link.rb +15 -0
  93. data/spec/ramaze/helper/pager.rb +26 -3
  94. data/spec/ramaze/helper/partial.rb +2 -2
  95. metadata +43 -4
  96. data/doc/COPYING.ja +0 -51
@@ -15,9 +15,15 @@ module Ramaze
15
15
  # end
16
16
 
17
17
  module Informing
18
- def tag_inform(tag, meth, *strings)
19
- strings.each do |string|
20
- string = (string.respond_to?(:to_str) ? string : string.send(meth))
18
+
19
+ # Takes the tag (:warn|:debug|:error|:info) and the name of a method to be
20
+ # called upon elements of msgs that don't respond to :to_str
21
+ # Goes on and sends the tag and transformed messages each to the #inform method.
22
+ # If you include this module you have to define #inform or it will raise.
23
+
24
+ def tag_inform(tag, meth, *msgs)
25
+ msgs.each do |msg|
26
+ string = (msg.respond_to?(:to_str) ? msg : msg.send(meth))
21
27
  inform(tag, string)
22
28
  end
23
29
  end
@@ -3,13 +3,17 @@
3
3
 
4
4
  module Ramaze
5
5
 
6
+ # Informer for the Knotify notfication system used on KDE.
7
+ # Doesn't need any special libraries.
8
+
6
9
  class Knotify
7
10
  include Informing
8
11
 
9
12
  trait :present => 16
10
13
 
11
- # Please see for more information:
14
+ # Please see for more information on the API used here:
12
15
  # http://lukeplant.me.uk/articles.php?id=3
16
+
13
17
  def inform(tag, *messages)
14
18
  present = class_trait[:present]
15
19
  tag = tag.to_s.capitalize
@@ -4,6 +4,9 @@
4
4
  require 'syslog'
5
5
 
6
6
  module Ramaze
7
+
8
+ # Informer for Syslog from rubys standard-library.
9
+
7
10
  class Syslog
8
11
  include ::Syslog
9
12
 
@@ -6,6 +6,11 @@ require 'thread'
6
6
 
7
7
  module Ramaze
8
8
 
9
+ # Informer for the XOSD notification system for X11.
10
+ #
11
+ # You can install the ruby-bindings with:
12
+ # gem install xosd.
13
+
9
14
  class Xosd < ::Xosd
10
15
  attr_accessor :options
11
16
 
@@ -36,6 +41,11 @@ module Ramaze
36
41
  # Here new messages are pushed to eventually displaying them.
37
42
  QUEUE = Queue.new
38
43
 
44
+ # Create a new instance, valid options are in DEFAULT.
45
+ # In the background a new thread will be running that checks the QUEUE
46
+ # and processes all messages that are being sent to it.
47
+ # This is done to make output nicer and readable.
48
+
39
49
  def initialize(options = {})
40
50
  @options = DEFAULT.merge(options)
41
51
 
@@ -67,6 +77,8 @@ module Ramaze
67
77
  end
68
78
  end
69
79
 
80
+ # pushes all messages it gets on the QUEUE for further processing.
81
+
70
82
  def inform(tag, *messages)
71
83
  messages.each do |message|
72
84
  QUEUE << [tag, message]
@@ -5,6 +5,9 @@
5
5
  # Amrita2, Erubis, Haml, Liquid and Markaby if you refer to them.
6
6
 
7
7
  module Ramaze
8
+
9
+ # Namespace for templating.
10
+
8
11
  module Template
9
12
 
10
13
  COMPILED = {} unless defined?(COMPILED)
@@ -5,7 +5,9 @@ require 'amrita2/template'
5
5
 
6
6
  module Ramaze
7
7
  module Template
8
+
8
9
  # Is responsible for compiling a template using the Amrita2 templating engine.
10
+ # Can be found at: http://rubyforge.org/projects/amrita2
9
11
 
10
12
  class Amrita2 < Template
11
13
 
@@ -7,6 +7,7 @@ module Ramaze
7
7
  module Template
8
8
 
9
9
  # Is responsible for compiling a template using the Erubis templating engine.
10
+ # Can be found at: http://rubyforge.org/projects/erubis
10
11
 
11
12
  class Erubis < Template
12
13
 
@@ -2,6 +2,7 @@
2
2
  # All files in this distribution are subject to the terms of the Ruby license.
3
3
 
4
4
  require 'ramaze/template/ezamar/engine'
5
+ require 'ramaze/template/ezamar/render_partial'
5
6
 
6
7
  module Ramaze
7
8
  module Template
@@ -123,7 +123,13 @@ class Ezamar::Element
123
123
  # <Page foo="true" />
124
124
 
125
125
  def finish_transform(klass, params, content)
126
- instance = constant(klass).new(content)
126
+ scope =
127
+ if Ramaze::Action.current
128
+ Ramaze::Action.current.controller
129
+ else
130
+ self.class
131
+ end
132
+ instance = scope.constant(klass).new(content)
127
133
 
128
134
  demunge_passed_variables(params).each do |key, value|
129
135
  instance.instance_variable_set("@#{key}", value)
@@ -147,17 +153,17 @@ class Ezamar::Element
147
153
  # Just remember, walk like a duck, talk like a duck.
148
154
 
149
155
  def demunge_passed_variables(template)
150
- template.scan(/\s?(.*?)="(.*?)"/).inject({}) do |hash, (key, value)|
156
+ template.scan(/\s?(.*?)=["'](.*?)["']/).inject({}) do |hash, (key, value)|
151
157
  value =
152
- case value
153
- when 'true'
154
- true
155
- when 'false'
156
- false
157
- else
158
- Integer(value) rescue Float(value) rescue value
159
- end
160
- hash.merge key => value
158
+ case value
159
+ when 'true'
160
+ true
161
+ when 'false'
162
+ false
163
+ else
164
+ Integer(value) rescue Float(value) rescue value
165
+ end
166
+ hash.merge key => value
161
167
  end
162
168
  end
163
169
  end
@@ -17,6 +17,11 @@ module Ezamar
17
17
  # This class is responsible for initializing and compiling the template.
18
18
 
19
19
  class Template
20
+
21
+ # Take a template (anything that responds to ::to_str) and options.
22
+ # At the moment the only option used is :file, which is used to tell
23
+ # Kernel::eval how to produce better backtraces.
24
+
20
25
  def initialize(template, options = {})
21
26
  @template, @options = template, options
22
27
  compile
@@ -2,20 +2,22 @@
2
2
  # All files in this distribution are subject to the terms of the Ruby license.
3
3
 
4
4
  require 'ramaze/template/ezamar/engine'
5
+ require 'ramaze/helper/partial'
5
6
 
6
7
  module Ezamar
7
8
  class RenderPartial
9
+ extend Ramaze::PartialHelper
8
10
 
9
11
  # Renders <render src="/path" [optional="option", ...]> in place.
10
12
  #
11
13
  # Other options than `src` will be transformed to session parameters for the
12
14
  # rendered action to use.
13
15
 
14
- def self.transform(template, action, file = __FILE__)
16
+ def self.transform(template)
15
17
  template.gsub!(/<render (.*?) \/>/) do |m|
16
18
  args = Hash[*$1.scan(/(\S+)=["'](.*?)["']/).flatten]
17
19
  if src = args.delete('src')
18
- PartialHelper.render_partial(src, args)
20
+ render_partial(src, args)
19
21
  end
20
22
  end
21
23
 
@@ -5,6 +5,10 @@ require 'haml/engine'
5
5
 
6
6
  module Ramaze
7
7
  module Template
8
+
9
+ # Is responsible for compiling a template using the Haml templating engine.
10
+ # Can be found at: http://haml.hamptoncatlin.com/
11
+
8
12
  class Haml < Template
9
13
 
10
14
  # Custom HAML-options for your controller to be merged.
@@ -5,6 +5,10 @@ require 'liquid'
5
5
 
6
6
  module Ramaze
7
7
  module Template
8
+
9
+ # Is responsible for compiling a template using the Liquid templating engine.
10
+ # Can be found at: http://home.leetsoft.com/liquid
11
+
8
12
  class Liquid < Template
9
13
 
10
14
  ENGINES[self] = %w[ liquid ]
@@ -5,6 +5,10 @@ require 'markaby'
5
5
 
6
6
  module Ramaze
7
7
  module Template
8
+
9
+ # Is responsible for compiling a template using the Markaby templating engine.
10
+ # Can be found at: http://code.whytheluckystiff.net/markaby/
11
+
8
12
  class Markaby < Template
9
13
  ENGINES[self] = %w[ mab ]
10
14
 
@@ -5,6 +5,10 @@ require 'remarkably/engines/html'
5
5
 
6
6
  module Ramaze
7
7
  module Template
8
+
9
+ # Is responsible for compiling a template using the Remarkably templating engine.
10
+ # Can be found at: http://rubyforge.org/projects/remarkably
11
+
8
12
  class Remarkably < Template
9
13
  ENGINES[self] = %w[ rem ]
10
14
 
@@ -0,0 +1,10 @@
1
+ # Copyright (c) 2006 Michael Fellinger m.fellinger@gmail.com
2
+ # All files in this distribution are subject to the terms of the Ruby license.
3
+
4
+ module Ramaze::Tool
5
+ autoload :Create, 'ramaze/tool/create'
6
+ autoload :Localize, 'ramaze/tool/localize'
7
+ autoload :Mime, 'ramaze/tool/mime'
8
+ autoload :Record, 'ramaze/tool/record'
9
+ autoload :Tidy, 'ramaze/tool/tidy'
10
+ end
@@ -48,7 +48,7 @@ class Ramaze::Tool::Localize
48
48
  locale = session[:LOCALE] || set_session_locale
49
49
 
50
50
  body.gsub!(trait[:regex]) do
51
- localize($1, locale)
51
+ localize($1, locale) unless $1.to_s.empty?
52
52
  end
53
53
 
54
54
  store(locale, trait[:default_language]) if trait[:collect]
@@ -1,7 +1,11 @@
1
1
  # Copyright (c) 2006 Michael Fellinger m.fellinger@gmail.com
2
2
  # All files in this distribution are subject to the terms of the Ruby license.
3
3
 
4
- require 'digest/sha2'
4
+ if RUBY_VERSION >= "1.9.0"
5
+ require 'digest/sha1'
6
+ else
7
+ require 'digest/sha2'
8
+ end
5
9
 
6
10
  module Ramaze
7
11
 
@@ -11,6 +15,9 @@ module Ramaze
11
15
  # are stored, about updates.
12
16
 
13
17
  class SessionHash
18
+
19
+ # Sets @hash to an empty Hash
20
+
14
21
  def initialize
15
22
  @hash = {}
16
23
  end
@@ -5,7 +5,7 @@ module Ramaze #:nodoc:
5
5
  module Version #:nodoc:
6
6
  MAJOR = 0
7
7
  MINOR = 1
8
- TINY = 2
8
+ TINY = 3
9
9
 
10
10
  STRING = [MAJOR, MINOR, TINY].join('.')
11
11
  end
@@ -232,7 +232,7 @@ end
232
232
 
233
233
  task 'release' => ['distribute'] do
234
234
  sh 'rubyforge login'
235
- sh 'rubyforge add_release ramaze ramaze #{VERS} pkg/ramaze-#{VERS}.gem'
235
+ #sh "rubyforge add_release ramaze ramaze #{VERS} pkg/ramaze-#{VERS}.gem"
236
236
 
237
237
  require 'open-uri'
238
238
  require 'hpricot'
@@ -267,7 +267,7 @@ task 'undocumented-module' do
267
267
  total, missing = [], []
268
268
  until @s.eos?
269
269
  unless @s.scan(/^\s*#.*/)
270
- comment = true if @s.scan(/^=begin$/)
270
+ comment = true if @s.scan(/^=begin[^$]*$/)
271
271
  comment = false if comment and @s.scan(/^=end$/)
272
272
 
273
273
  unless comment
@@ -6,7 +6,7 @@ describe 'Action() basics' do
6
6
 
7
7
  action.params.should == []
8
8
  action.method.should be_nil
9
- action.template.should be_nil
9
+ action.template.should be_nil
10
10
  end
11
11
 
12
12
  it 'should sanitize parameters' do
data/spec/ramaze/cache.rb CHANGED
@@ -60,5 +60,16 @@ caches.each do |cache, name|
60
60
  @cache[:beh] = :feh
61
61
  @cache.values_at(:baz, :beh).should == [:foo, :feh]
62
62
  end
63
+
64
+ it "different cache namespaces should not overlap" do
65
+ Ramaze::Cache.add :foo
66
+ Ramaze::Cache.add :bar
67
+
68
+ key = "foobar"
69
+ Ramaze::Cache.foo[key] = 'foo'
70
+ Ramaze::Cache.bar[key] = 'bar'
71
+
72
+ Ramaze::Cache.foo[key].should_not == Ramaze::Cache.bar[key]
73
+ end
63
74
  end
64
75
  end
@@ -54,7 +54,6 @@ describe "Controller" do
54
54
  ],
55
55
 
56
56
  '/foo/bar' => [
57
- ["/foo__bar", "index", []],
58
57
  ["/foo/bar", "index", []],
59
58
 
60
59
  ["/foo", "bar", []],
@@ -67,12 +66,8 @@ describe "Controller" do
67
66
 
68
67
  '/foo/bar/baz' => [
69
68
 
70
- ['/foo__bar__baz', 'index', []],
71
69
  ['/foo/bar/baz', 'index', []],
72
70
 
73
- ['/foo__bar', 'baz', []],
74
- ['/foo__bar', 'index', ['baz']],
75
-
76
71
  ['/foo/bar', 'baz', []],
77
72
  ['/foo/bar', 'index', ['baz']],
78
73
 
@@ -87,20 +82,11 @@ describe "Controller" do
87
82
  ],
88
83
 
89
84
  '/foo/bar/baz/oof' => [
90
- ['/foo__bar__baz__oof', 'index', []],
91
-
92
85
  ['/foo/bar/baz/oof', 'index', []],
93
86
 
94
- ['/foo__bar__baz', 'oof', []],
95
- ['/foo__bar__baz', 'index', ['oof']],
96
-
97
87
  ['/foo/bar/baz', 'oof', []],
98
88
  ['/foo/bar/baz', 'index', ['oof']],
99
89
 
100
- ['/foo__bar', 'baz__oof', []],
101
- ['/foo__bar', 'baz', ['oof']],
102
- ['/foo__bar', 'index', ['baz', 'oof']],
103
-
104
90
  ['/foo/bar', 'baz__oof', []],
105
91
  ['/foo/bar', 'baz', ['oof']],
106
92
  ['/foo/bar', 'index', ['baz', 'oof']],
@@ -3,22 +3,22 @@ require 'spec/helper'
3
3
  describe 'Dispatcher::File' do
4
4
  before :all do
5
5
  ramaze
6
+ @public_root = Ramaze::Global.public_root = 'spec/ramaze/dispatcher/public'
6
7
  end
7
8
 
8
9
  it 'should serve from proto/public' do
9
10
  end
10
11
 
11
12
  it 'should serve from Global.public_root' do
12
- dir = Ramaze::Global.public_root = 'spec/ramaze/public'
13
- css = File.read(dir/'test_download.css')
13
+ css = File.read(@public_root/'test_download.css')
14
14
  re_css = get('/test_download.css')
15
15
  re_css.body.should == css
16
16
  re_css.status.should == 200
17
17
  end
18
18
 
19
- it 'should serve from Global.public_proto' do
20
- file = (Ramaze::Global.public_proto/'error.zmr')
19
+ it 'should give priority to Global.public_root' do
20
+ file = (@public_root/'favicon.ico')
21
21
  original = File.read(file)
22
- get('/error.zmr').body.should == original
22
+ get('/favicon.ico').body.should == original
23
23
  end
24
24
  end
@@ -0,0 +1,141 @@
1
+ /*#############################################################
2
+ * Name: Light
3
+ * Date: 2006-08-20
4
+ * Description: Bright and smooth.
5
+ * Author: Viktor Persson
6
+ * URL: http://templates.arcsin.se
7
+ *
8
+ * Feel free to use and modify but please provide credits.
9
+ * #############################################################*/
10
+
11
+ /* standard elements */
12
+ {
13
+ margin: 0;
14
+ padding: 0;
15
+ }
16
+ a {
17
+ color: #567;
18
+ }
19
+ a:hover {
20
+ color: #28E;
21
+ }
22
+ body {
23
+ background: #F2F2F2 url(/media/bg.gif) repeat-y center top;
24
+ color: #555A60;
25
+ font: normal 62.5% "Lucida Sans Unicode",sans-serif;
26
+ margin: 0;
27
+ }
28
+ p,cite,code,ul {
29
+ font-size: 1.0em;
30
+ padding-bottom: 1.2em;
31
+ }
32
+ h1 {
33
+ font-size: 1.4em;
34
+ margin-bottom: 4px;
35
+ }
36
+ li {
37
+ list-style: url(/media/li.gif);
38
+ margin-left: 18px;
39
+ }
40
+ code {
41
+ background: url(/media/bgcode.gif);
42
+ border: 1px solid #F6F6F6;
43
+ color: #666;
44
+ display: block;
45
+ font: normal 1.1em "Lucida Sans Unicode",serif;
46
+ margin-bottom: 12px;
47
+ padding: 8px 10px;
48
+ white-space: pre;
49
+ }
50
+ cite {
51
+ background: url(/media/quote.gif) no-repeat;
52
+ color: #456;
53
+ display: block;
54
+ font: normal 1.4em "Lucida Sans Unicode",serif;
55
+ padding-left: 28px;
56
+ }
57
+ h1,h2,h3 {
58
+ color: #579;
59
+ padding-top: 6px;
60
+ }
61
+ *
62
+ /* misc */
63
+ .clearer {
64
+ clear: both;
65
+ }
66
+
67
+ /* structure */
68
+ .container {
69
+ margin: 0 auto;
70
+ width: 730px;
71
+ }
72
+
73
+ /* title */
74
+ .title {
75
+ float: left;
76
+ margin-top: 22px;
77
+ text-align: center;
78
+ width: 220px;
79
+ }
80
+ .title h1 {
81
+ font: normal 2em Verdana,sans-serif;
82
+ }
83
+ .title h2 {
84
+ color: #999;
85
+ font: normal 1.1em Verdana,sans-serif;
86
+ }
87
+
88
+ /* navigation */
89
+ .navigation {
90
+ background: url(/media/holder.jpg) no-repeat;
91
+ height: 100px;
92
+ padding: 0 16px;
93
+ }
94
+ .navigation a {
95
+ border-left: 1px solid #DDD;
96
+ border-right: 1px solid #FFF;
97
+ color: #89A;
98
+ float: right;
99
+ font: bold 1.2em "Trebuchet MS",sans-serif;
100
+ margin-top: 9px;
101
+ padding: 58px 18px 8px;
102
+ text-align: center;
103
+ text-decoration: none;
104
+ }
105
+ .navigation a:hover {
106
+ background: #FFF url(/media/navhover.gif) repeat-x;
107
+ color: #28E;
108
+ padding: 56px 18px 10px;
109
+ }
110
+
111
+ /* holders */
112
+ .holder {
113
+ background: url(/media/bgholder.jpg) repeat-y;
114
+ padding: 0 32px;
115
+ }
116
+ .holder_top,.footer {
117
+ clear: both;
118
+ background: url(/media/holder.jpg) no-repeat;
119
+ height: 40px;
120
+ }
121
+
122
+ /* footer */
123
+ .footer {
124
+ background-position: left bottom;
125
+ color: #666;
126
+ font-size: 1.1em;
127
+ text-align: center;
128
+ }
129
+
130
+ form {
131
+ text-align: right;
132
+ }
133
+
134
+ form input {
135
+ width: 95%;
136
+ }
137
+
138
+ form textarea {
139
+ width: 95%;
140
+ height: 30em;
141
+ }