howlr 0.1.0.34 → 0.2.0.43

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,9 +1,10 @@
1
- == 0.2.0 In Progress...
1
+ == 0.2.0 2010-02-08
2
2
 
3
+ * Refactored for Picnic 0.8.0 or higher; now works with Rack/Passenger.
3
4
  * Can now force all outgoing messages to be sent to some given recipient,
4
5
  overriding the message's actual recipient using the --override-recipient
5
6
  command-line option. This is useful for testing and debugging.
6
7
 
7
8
  == 0.1.0 2008-03-10
8
9
 
9
- * First public release.
10
+ * First public release.
@@ -16,8 +16,8 @@ lib/howlr.rb
16
16
  lib/howlr/controllers.rb
17
17
  lib/howlr/deliverers.rb
18
18
  lib/howlr/deliverers/email/mailer/message.rhtml
19
- lib/howlr/environment.rb
20
19
  lib/howlr/message.rb
20
+ lib/howlr/prep.rb
21
21
  lib/howlr/version.rb
22
22
  lib/howlr/views.rb
23
23
  script/console
@@ -31,8 +31,4 @@ tasks/website.rake
31
31
  test/howlr_test.rb
32
32
  test/test_helper.rb
33
33
  test/test_howlr.rb
34
- website/index.html
35
- website/index.txt
36
- website/javascripts/rounded_corners_lite.inc.js
37
- website/stylesheets/screen.css
38
- website/template.html.erb
34
+
@@ -1,4 +1,11 @@
1
1
 
2
- For more information on howlr, see http://howlr.rubyforge.org
2
+ Next steps:
3
+
4
+ 1. Run the `howlr` command. A sample config file will be created
5
+ in /etc/howlr/config.yml
6
+ 2. Edit the config.yml to fit your needs.
7
+ 3. Run `howlr` again. The server should start up in the foreground.
8
+ Alternatively run `howlr-service-ctl start` to start as a daemon.
3
9
 
10
+ For more information on howlr, see http://howlr.rubyforge.org
4
11
 
data/bin/howlr CHANGED
@@ -36,7 +36,7 @@ end
36
36
 
37
37
  cli = Picnic::Cli.new(
38
38
  'howlr',
39
- :app_path => File.expand_path(File.dirname(File.expand_path(__FILE__))),
39
+ :app_file => File.expand_path(File.dirname(File.expand_path(__FILE__))+"/../lib/howlr.rb"),
40
40
  :extra_cli_options => extra_cli_options
41
41
  )
42
42
 
@@ -8,7 +8,7 @@ RUBYFORGE_PROJECT = 'howlr' # The unix name for your project
8
8
  HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
9
9
  DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
10
10
  EXTRA_DEPENDENCIES = [
11
- 'picnic',
11
+ ['picnic', '>= 0.8.1.20100201'],
12
12
  'actionmailer'
13
13
  # ['activesupport', '>= 1.3.1']
14
14
  ] # An array of rubygem dependencies [name, version]
@@ -63,7 +63,7 @@ $hoe = Hoe.new(GEM_NAME, VERS) do |p|
63
63
 
64
64
  # == Optional
65
65
  p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
66
- #p.extra_deps = EXTRA_DEPENDENCIES
66
+ p.extra_deps = EXTRA_DEPENDENCIES
67
67
 
68
68
  #p.spec_extras = {} # A hash of extra values to set in the gemspec.
69
69
  end
@@ -13,12 +13,16 @@
13
13
  # You should have received a copy of the GNU General Public License
14
14
  # along with Howlr. If not, see <http://www.gnu.org/licenses/>.
15
15
 
16
- $: << File.dirname(File.expand_path(__FILE__))
17
- require 'howlr/environment'
16
+ $APP_NAME ||= 'howlr'
17
+ $APP_ROOT ||= File.expand_path(File.dirname(__FILE__)+'/..')
18
+
19
+ $: << $APP_ROOT+"/lib"
20
+
21
+ require 'howlr/prep'
18
22
 
19
23
  Camping.goes :Howlr
20
24
 
21
- Howlr.picnic!
25
+ Picnic::Logger.init_global_logger!
22
26
 
23
27
  require 'howlr/views'
24
28
  require 'howlr/controllers'
@@ -27,20 +31,21 @@ require 'howlr/controllers'
27
31
  $CONF[:authentication] ||= {:username => 'howlr', :password => 'howl!'}
28
32
  $CONF[:mailer] ||= {:delivery_method => 'sendmail'}
29
33
 
30
- if Howlr::Conf[:authentication]
31
- Howlr.authenticate_using(Howlr::Conf[:authentication][:method] || :basic)
32
- end
33
-
34
34
  module Howlr
35
+ include Howlr::Models
36
+ include Picnic::Authentication
37
+
35
38
  def self.authenticate(credentials)
36
- credentials[:username] == Howlr::Conf[:authentication][:username] &&
37
- credentials[:password] == Howlr::Conf[:authentication][:password]
39
+ credentials[:username] == $CONF[:authentication][:username] &&
40
+ credentials[:password] == $CONF[:authentication][:password]
38
41
  end
39
42
  end
40
43
 
41
- def Howlr.create
42
- Howlr::Deliverers::Email::Mailer.delivery_method = Howlr::Conf[:mailer][:delivery_method]
43
- Howlr::Deliverers::Email::Mailer.smtp_settings = Howlr::Conf[:mailer][:smtp_settings]
44
+ if $CONF[:authentication]
45
+ Howlr.authenticate_using($CONF[:authentication][:method] || :basic)
44
46
  end
45
47
 
46
- Howlr.start_picnic
48
+ def Howlr.create
49
+ Howlr::Deliverers::Email::Mailer.delivery_method = $CONF[:mailer][:delivery_method]
50
+ Howlr::Deliverers::Email::Mailer.smtp_settings = $CONF[:mailer][:smtp_settings]
51
+ end
@@ -42,11 +42,11 @@ module Howlr::Controllers
42
42
 
43
43
  # Create and send a new message.
44
44
  def create
45
- if @input['rest'] == '1' && @input['0']
45
+ if input['rest'] == '1' && input['0']
46
46
  # for PHP Zend_Rest_Client compatibility
47
- data = @input['0']
47
+ data = input['0']
48
48
  else
49
- data = @input
49
+ data = input
50
50
  end
51
51
 
52
52
  data[:author] ||= @env['REMOTE_HOST']
@@ -54,7 +54,7 @@ module Howlr::Controllers
54
54
  $LOG.debug "Creating new message from: #{data.inspect}"
55
55
 
56
56
 
57
- @message = Howlr::Message.new(data)
57
+ @message = Howlr::Message.new(HashWithIndifferentAccess.new(data))
58
58
  $LOG.debug "Sending message: #{@message.inspect}"
59
59
 
60
60
  @@messages << @message
@@ -95,33 +95,33 @@ module Howlr::Controllers
95
95
  # meant to illustrate how a message callback receiver can be implemented.
96
96
  class DeliveryNotifications < REST 'delivery_notifications'
97
97
  def create
98
- $LOG.debug "Creating delivery notification from: #{@input.inspect}"
98
+ $LOG.debug "Creating delivery notification from: #{input.inspect}"
99
99
 
100
100
  auth = {
101
- :username => Conf[:auth_username],
102
- :password => Conf[:auth_password]
101
+ :username => $CONF[:auth_username],
102
+ :password => $CONF[:auth_password]
103
103
  }
104
104
 
105
105
  begin
106
- m = Restr.get("http://localhost:#{Conf[:port]}#{Conf[:uri_path]}messages",
107
- {:id => @input[:message_id], :format => 'XML'},
106
+ m = Restr.get("http://localhost:#{$CONF[:port]}#{$CONF[:uri_path]}messages",
107
+ {:id => input[:message_id], :format => 'XML'},
108
108
  auth)
109
109
 
110
110
  to = m['from']
111
111
  subject = "Howlr Message Delivery Notification"
112
112
 
113
113
  body = "Your message regarding #{m['subject'].inspect} was " +
114
- (@input[:send_success] == 'true' ? '' : 'NOT') +
115
- " sent successfully to #{@input[:recipient_address]}."
114
+ (input[:send_success] == 'true' ? '' : 'NOT') +
115
+ " sent successfully to #{input[:recipient_address]}."
116
116
 
117
117
  data = {
118
118
  :recipients => to,
119
119
  :body => body,
120
120
  :subject => subject,
121
- :from => @input[:recipient_address]
121
+ :from => input[:recipient_address]
122
122
  }
123
123
 
124
- Restr.post("http://localhost:#{Conf.port}#{Conf.uri_path}messages",
124
+ Restr.post("http://localhost:#{$CONF.port}#{$CONF.uri_path}messages",
125
125
  data, auth)
126
126
 
127
127
  rescue Net::HTTPServerException, Net::HTTPError => e
@@ -26,7 +26,11 @@ module Howlr::Deliverers
26
26
  def self.deliver(message, options = {})
27
27
  recipients = []
28
28
  message.recipients.each do |r|
29
- recipients << $OVERRIDE_RECIPIENT || (r.respond_to?(:address) ? r.address : r)
29
+ if $OVERRIDE_RECIPIENT.blank? # set using --override-recipient CLI option
30
+ recipients << (r.respond_to?(:address) ? r.address : r)
31
+ else
32
+ recipients << $OVERRIDE_RECIPIENT
33
+ end
30
34
  end
31
35
 
32
36
  Mailer.raise_delivery_errors = true
@@ -76,7 +76,7 @@ class Howlr::Message
76
76
  @sent = Time.now.to_s if (result && (@sent || @sent.nil?))
77
77
 
78
78
  begin
79
- callback(r, result) unless callback_url.nil? || callback_url.blank?
79
+ callback(r, result) unless callback_url.nil? || callback_url.blank?
80
80
  rescue => e
81
81
  $LOG.error("Error during callback: #{e}")
82
82
  e2 = CallbackError.new("Error during callback: #{e}")
@@ -0,0 +1,80 @@
1
+ # This file is part of Howlr.
2
+ #
3
+ # Howlr is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # Howlr is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with Howlr. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ # Load Picnic
17
+ unless Object.const_defined?(:Picnic)
18
+ if File.exists?(picnic = File.expand_path(File.dirname(File.expand_path(__FILE__))+'/../../vendor/picnic/lib'))
19
+ $: << picnic
20
+ elsif File.exists?(picnic = File.expand_path(File.dirname(File.expand_path(__FILE__))+'/../../../picnic/lib'))
21
+ $: << picnic
22
+ else
23
+ require 'rubygems'
24
+
25
+ # make things backwards-compatible for rubygems < 0.9.0
26
+ if respond_to?(:require_gem)
27
+ puts "WARNING: aliasing 'gem' to 'require_gem' in #{__FILE__} -- you should update your RubyGems system!"
28
+ alias gem require_gem
29
+ end
30
+
31
+ gem 'picnic'
32
+ end
33
+
34
+ require 'picnic'
35
+ end
36
+
37
+ # Load Reststop
38
+ if File.exists?(reststop = File.expand_path(File.dirname(File.expand_path(__FILE__))+'/../../vendor/reststop/lib'))
39
+ $: << reststop
40
+ elsif File.exists?(reststop = File.expand_path(File.dirname(File.expand_path(__FILE__))+'/../../../reststop/lib'))
41
+ $: << reststop
42
+ else
43
+ require 'rubygems'
44
+
45
+ # make things backwards-compatible for rubygems < 0.9.0
46
+ if respond_to?(:require_gem)
47
+ puts "WARNING: aliasing gem to require_gem in #{__FILE__} -- you should update your RubyGems system!"
48
+ alias gem require_gem
49
+ end
50
+
51
+ gem 'reststop'
52
+ end
53
+
54
+ require 'reststop'
55
+
56
+
57
+ # Load configuration
58
+ unless $CONF
59
+ unless $APP_NAME && $APP_ROOT
60
+ raise "Can't load the Taskr configuration because $APP_NAME and/or $APP_ROOT are not defined."
61
+ end
62
+
63
+ require 'picnic/conf'
64
+ $CONF = Picnic::Conf.new
65
+ $CONF.load_from_file($APP_NAME, $APP_ROOT)
66
+ end
67
+
68
+ $CONF.merge_defaults(
69
+ :log => {:file => 'taskr.log', :level => 'DEBUG'},
70
+ :uri_path => "/",
71
+ :static => {:root => $APP_ROOT, :urls => "/public"}
72
+ )
73
+
74
+ require 'yaml'
75
+ require 'markaby'
76
+ require 'picnic/logger'
77
+ require 'picnic/authentication'
78
+
79
+
80
+
@@ -1,7 +1,7 @@
1
1
  module Howlr
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 1
4
+ MINOR = 2
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: howlr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.34
4
+ version: 0.2.0.43
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Zukowski
@@ -9,9 +9,49 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-08 00:00:00 -04:00
12
+ date: 2010-02-08 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: picnic
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.8.1.20100201
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: actionmailer
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: rubyforge
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 2.0.3
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: gemcutter
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.2.1
54
+ version:
15
55
  - !ruby/object:Gem::Dependency
16
56
  name: hoe
17
57
  type: :development
@@ -20,7 +60,7 @@ dependencies:
20
60
  requirements:
21
61
  - - ">="
22
62
  - !ruby/object:Gem::Version
23
- version: 1.7.0
63
+ version: 2.5.0
24
64
  version:
25
65
  description: Daemon for sending out messages/emails via a RESTful API.
26
66
  email:
@@ -37,7 +77,6 @@ extra_rdoc_files:
37
77
  - Manifest.txt
38
78
  - PostInstall.txt
39
79
  - README.txt
40
- - website/index.txt
41
80
  files:
42
81
  - CHANGELOG.txt
43
82
  - History.txt
@@ -57,8 +96,8 @@ files:
57
96
  - lib/howlr/controllers.rb
58
97
  - lib/howlr/deliverers.rb
59
98
  - lib/howlr/deliverers/email/mailer/message.rhtml
60
- - lib/howlr/environment.rb
61
99
  - lib/howlr/message.rb
100
+ - lib/howlr/prep.rb
62
101
  - lib/howlr/version.rb
63
102
  - lib/howlr/views.rb
64
103
  - script/console
@@ -72,17 +111,21 @@ files:
72
111
  - test/howlr_test.rb
73
112
  - test/test_helper.rb
74
113
  - test/test_howlr.rb
75
- - website/index.html
76
- - website/index.txt
77
- - website/javascripts/rounded_corners_lite.inc.js
78
- - website/stylesheets/screen.css
79
- - website/template.html.erb
80
114
  has_rdoc: true
81
115
  homepage: http://howlr.rubyforge.org
116
+ licenses: []
117
+
82
118
  post_install_message: |+
83
119
 
84
- For more information on howlr, see http://howlr.rubyforge.org
120
+ Next steps:
85
121
 
122
+ 1. Run the `howlr` command. A sample config file will be created
123
+ in /etc/howlr/config.yml
124
+ 2. Edit the config.yml to fit your needs.
125
+ 3. Run `howlr` again. The server should start up in the foreground.
126
+ Alternatively run `howlr-service-ctl start` to start as a daemon.
127
+
128
+ For more information on howlr, see http://howlr.rubyforge.org
86
129
 
87
130
  rdoc_options:
88
131
  - --main
@@ -104,9 +147,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
147
  requirements: []
105
148
 
106
149
  rubyforge_project: howlr
107
- rubygems_version: 1.2.0
150
+ rubygems_version: 1.3.5
108
151
  signing_key:
109
- specification_version: 2
152
+ specification_version: 3
110
153
  summary: Daemon for sending out messages/emails via a RESTful API.
111
154
  test_files:
112
155
  - test/test_howlr.rb
@@ -1,35 +0,0 @@
1
- # This file is part of Howlr.
2
- #
3
- # Howlr is free software: you can redistribute it and/or modify
4
- # it under the terms of the GNU General Public License as published by
5
- # the Free Software Foundation, either version 3 of the License, or
6
- # (at your option) any later version.
7
- #
8
- # Howlr is distributed in the hope that it will be useful,
9
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- # GNU General Public License for more details.
12
- #
13
- # You should have received a copy of the GNU General Public License
14
- # along with Howlr. If not, see <http://www.gnu.org/licenses/>.
15
-
16
- $: << File.dirname(File.expand_path(__FILE__))
17
-
18
- # Try to load local versions of Picnic and Reststop if possible...
19
- $: << File.dirname(File.expand_path(__FILE__))+"/../../../picnic/lib"
20
- $: << File.dirname(File.expand_path(__FILE__))+"/../../vendor/picnic/lib"
21
- $: << File.dirname(File.expand_path(__FILE__))+"/../../../reststop/lib"
22
- $: << File.dirname(File.expand_path(__FILE__))+"/../../vendor/reststop/lib"
23
-
24
- require 'rubygems'
25
-
26
- # make things backwards-compatible for rubygems < 0.9.0
27
- unless Object.method_defined? :gem
28
- alias gem require_gem
29
- end
30
-
31
- require 'picnic'
32
- require 'reststop'
33
-
34
-
35
-
@@ -1,11 +0,0 @@
1
- <html>
2
- <head>
3
- <meta http-equiv="Content-type" content="text/html; charset=utf-8">
4
- <title>howlr</title>
5
-
6
- </head>
7
- <body id="body">
8
- <p>This page has not yet been created for RubyGem <code>howlr</code></p>
9
- <p>To the developer: To generate it, update website/index.txt and run the rake task <code>website</code> to generate this <code>index.html</code> file.</p>
10
- </body>
11
- </html>
@@ -1,83 +0,0 @@
1
- h1. howlr
2
-
3
- h1. &#x2192; 'howlr'
4
-
5
-
6
- h2. What
7
-
8
-
9
- h2. Installing
10
-
11
- <pre syntax="ruby">sudo gem install howlr</pre>
12
-
13
- h2. The basics
14
-
15
-
16
- h2. Demonstration of usage
17
-
18
-
19
-
20
- h2. Forum
21
-
22
- "http://groups.google.com/group/howlr":http://groups.google.com/group/howlr
23
-
24
- TODO - create Google Group - howlr
25
-
26
- h2. How to submit patches
27
-
28
- Read the "8 steps for fixing other people's code":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/ and for section "8b: Submit patch to Google Groups":http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups, use the Google Group above.
29
-
30
- TODO - pick SVN or Git instructions
31
-
32
- The trunk repository is <code>svn://rubyforge.org/var/svn/howlr/trunk</code> for anonymous access.
33
-
34
- OOOORRRR
35
-
36
- You can fetch the source from either:
37
-
38
- <% if rubyforge_project_id %>
39
-
40
- * rubyforge: "http://rubyforge.org/scm/?group_id=<%= rubyforge_project_id %>":http://rubyforge.org/scm/?group_id=<%= rubyforge_project_id %>
41
-
42
- <pre>git clone git://rubyforge.org/howlr.git</pre>
43
-
44
- <% else %>
45
-
46
- * rubyforge: MISSING IN ACTION
47
-
48
- TODO - You can not created a RubyForge project, OR have not run <code>rubyforge config</code>
49
- yet to refresh your local rubyforge data with this projects' id information.
50
-
51
- When you do this, this message will magically disappear!
52
-
53
- Or you can hack website/index.txt and make it all go away!!
54
-
55
- <% end %>
56
-
57
- * github: "http://github.com/GITHUB_USERNAME/howlr/tree/master":http://github.com/GITHUB_USERNAME/howlr/tree/master
58
-
59
- <pre>git clone git://github.com/GITHUB_USERNAME/howlr.git</pre>
60
-
61
-
62
- TODO - add "github_username: username" to ~/.rubyforge/user-config.yml and newgem will reuse it for future projects.
63
-
64
-
65
- * gitorious: "git://gitorious.org/howlr/mainline.git":git://gitorious.org/howlr/mainline.git
66
-
67
- <pre>git clone git://gitorious.org/howlr/mainline.git</pre>
68
-
69
- h3. Build and test instructions
70
-
71
- <pre>cd howlr
72
- rake test
73
- rake install_gem</pre>
74
-
75
-
76
- h2. License
77
-
78
- This code is free to use under the terms of the MIT license.
79
-
80
- h2. Contact
81
-
82
- Comments are welcome. Send an email to "FIXME full name":mailto:FIXME email via the "forum":http://groups.google.com/group/howlr
83
-
@@ -1,285 +0,0 @@
1
-
2
- /****************************************************************
3
- * *
4
- * curvyCorners *
5
- * ------------ *
6
- * *
7
- * This script generates rounded corners for your divs. *
8
- * *
9
- * Version 1.2.9 *
10
- * Copyright (c) 2006 Cameron Cooke *
11
- * By: Cameron Cooke and Tim Hutchison. *
12
- * *
13
- * *
14
- * Website: http://www.curvycorners.net *
15
- * Email: info@totalinfinity.com *
16
- * Forum: http://www.curvycorners.net/forum/ *
17
- * *
18
- * *
19
- * This library is free software; you can redistribute *
20
- * it and/or modify it under the terms of the GNU *
21
- * Lesser General Public License as published by the *
22
- * Free Software Foundation; either version 2.1 of the *
23
- * License, or (at your option) any later version. *
24
- * *
25
- * This library is distributed in the hope that it will *
26
- * be useful, but WITHOUT ANY WARRANTY; without even the *
27
- * implied warranty of MERCHANTABILITY or FITNESS FOR A *
28
- * PARTICULAR PURPOSE. See the GNU Lesser General Public *
29
- * License for more details. *
30
- * *
31
- * You should have received a copy of the GNU Lesser *
32
- * General Public License along with this library; *
33
- * Inc., 59 Temple Place, Suite 330, Boston, *
34
- * MA 02111-1307 USA *
35
- * *
36
- ****************************************************************/
37
-
38
- var isIE = navigator.userAgent.toLowerCase().indexOf("msie") > -1; var isMoz = document.implementation && document.implementation.createDocument; var isSafari = ((navigator.userAgent.toLowerCase().indexOf('safari')!=-1)&&(navigator.userAgent.toLowerCase().indexOf('mac')!=-1))?true:false; function curvyCorners()
39
- { if(typeof(arguments[0]) != "object") throw newCurvyError("First parameter of curvyCorners() must be an object."); if(typeof(arguments[1]) != "object" && typeof(arguments[1]) != "string") throw newCurvyError("Second parameter of curvyCorners() must be an object or a class name."); if(typeof(arguments[1]) == "string")
40
- { var startIndex = 0; var boxCol = getElementsByClass(arguments[1]);}
41
- else
42
- { var startIndex = 1; var boxCol = arguments;}
43
- var curvyCornersCol = new Array(); if(arguments[0].validTags)
44
- var validElements = arguments[0].validTags; else
45
- var validElements = ["div"]; for(var i = startIndex, j = boxCol.length; i < j; i++)
46
- { var currentTag = boxCol[i].tagName.toLowerCase(); if(inArray(validElements, currentTag) !== false)
47
- { curvyCornersCol[curvyCornersCol.length] = new curvyObject(arguments[0], boxCol[i]);}
48
- }
49
- this.objects = curvyCornersCol; this.applyCornersToAll = function()
50
- { for(var x = 0, k = this.objects.length; x < k; x++)
51
- { this.objects[x].applyCorners();}
52
- }
53
- }
54
- function curvyObject()
55
- { this.box = arguments[1]; this.settings = arguments[0]; this.topContainer = null; this.bottomContainer = null; this.masterCorners = new Array(); this.contentDIV = null; var boxHeight = get_style(this.box, "height", "height"); var boxWidth = get_style(this.box, "width", "width"); var borderWidth = get_style(this.box, "borderTopWidth", "border-top-width"); var borderColour = get_style(this.box, "borderTopColor", "border-top-color"); var boxColour = get_style(this.box, "backgroundColor", "background-color"); var backgroundImage = get_style(this.box, "backgroundImage", "background-image"); var boxPosition = get_style(this.box, "position", "position"); var boxPadding = get_style(this.box, "paddingTop", "padding-top"); this.boxHeight = parseInt(((boxHeight != "" && boxHeight != "auto" && boxHeight.indexOf("%") == -1)? boxHeight.substring(0, boxHeight.indexOf("px")) : this.box.scrollHeight)); this.boxWidth = parseInt(((boxWidth != "" && boxWidth != "auto" && boxWidth.indexOf("%") == -1)? boxWidth.substring(0, boxWidth.indexOf("px")) : this.box.scrollWidth)); this.borderWidth = parseInt(((borderWidth != "" && borderWidth.indexOf("px") !== -1)? borderWidth.slice(0, borderWidth.indexOf("px")) : 0)); this.boxColour = format_colour(boxColour); this.boxPadding = parseInt(((boxPadding != "" && boxPadding.indexOf("px") !== -1)? boxPadding.slice(0, boxPadding.indexOf("px")) : 0)); this.borderColour = format_colour(borderColour); this.borderString = this.borderWidth + "px" + " solid " + this.borderColour; this.backgroundImage = ((backgroundImage != "none")? backgroundImage : ""); this.boxContent = this.box.innerHTML; if(boxPosition != "absolute") this.box.style.position = "relative"; this.box.style.padding = "0px"; if(isIE && boxWidth == "auto" && boxHeight == "auto") this.box.style.width = "100%"; if(this.settings.autoPad == true && this.boxPadding > 0)
56
- this.box.innerHTML = ""; this.applyCorners = function()
57
- { for(var t = 0; t < 2; t++)
58
- { switch(t)
59
- { case 0:
60
- if(this.settings.tl || this.settings.tr)
61
- { var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var topMaxRadius = Math.max(this.settings.tl ? this.settings.tl.radius : 0, this.settings.tr ? this.settings.tr.radius : 0); newMainContainer.style.height = topMaxRadius + "px"; newMainContainer.style.top = 0 - topMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.topContainer = this.box.appendChild(newMainContainer);}
62
- break; case 1:
63
- if(this.settings.bl || this.settings.br)
64
- { var newMainContainer = document.createElement("DIV"); newMainContainer.style.width = "100%"; newMainContainer.style.fontSize = "1px"; newMainContainer.style.overflow = "hidden"; newMainContainer.style.position = "absolute"; newMainContainer.style.paddingLeft = this.borderWidth + "px"; newMainContainer.style.paddingRight = this.borderWidth + "px"; var botMaxRadius = Math.max(this.settings.bl ? this.settings.bl.radius : 0, this.settings.br ? this.settings.br.radius : 0); newMainContainer.style.height = botMaxRadius + "px"; newMainContainer.style.bottom = 0 - botMaxRadius + "px"; newMainContainer.style.left = 0 - this.borderWidth + "px"; this.bottomContainer = this.box.appendChild(newMainContainer);}
65
- break;}
66
- }
67
- if(this.topContainer) this.box.style.borderTopWidth = "0px"; if(this.bottomContainer) this.box.style.borderBottomWidth = "0px"; var corners = ["tr", "tl", "br", "bl"]; for(var i in corners)
68
- { if(i > -1 < 4)
69
- { var cc = corners[i]; if(!this.settings[cc])
70
- { if(((cc == "tr" || cc == "tl") && this.topContainer != null) || ((cc == "br" || cc == "bl") && this.bottomContainer != null))
71
- { var newCorner = document.createElement("DIV"); newCorner.style.position = "relative"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; if(this.backgroundImage == "")
72
- newCorner.style.backgroundColor = this.boxColour; else
73
- newCorner.style.backgroundImage = this.backgroundImage; switch(cc)
74
- { case "tl":
75
- newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.tr.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.left = -this.borderWidth + "px"; break; case "tr":
76
- newCorner.style.height = topMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.tl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderTop = this.borderString; newCorner.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; newCorner.style.left = this.borderWidth + "px"; break; case "bl":
77
- newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginRight = this.settings.br.radius - (this.borderWidth*2) + "px"; newCorner.style.borderLeft = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = -this.borderWidth + "px"; newCorner.style.backgroundPosition = "-" + (this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break; case "br":
78
- newCorner.style.height = botMaxRadius - this.borderWidth + "px"; newCorner.style.marginLeft = this.settings.bl.radius - (this.borderWidth*2) + "px"; newCorner.style.borderRight = this.borderString; newCorner.style.borderBottom = this.borderString; newCorner.style.left = this.borderWidth + "px"
79
- newCorner.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (botMaxRadius + this.borderWidth)) + "px"; break;}
80
- }
81
- }
82
- else
83
- { if(this.masterCorners[this.settings[cc].radius])
84
- { var newCorner = this.masterCorners[this.settings[cc].radius].cloneNode(true);}
85
- else
86
- { var newCorner = document.createElement("DIV"); newCorner.style.height = this.settings[cc].radius + "px"; newCorner.style.width = this.settings[cc].radius + "px"; newCorner.style.position = "absolute"; newCorner.style.fontSize = "1px"; newCorner.style.overflow = "hidden"; var borderRadius = parseInt(this.settings[cc].radius - this.borderWidth); for(var intx = 0, j = this.settings[cc].radius; intx < j; intx++)
87
- { if((intx +1) >= borderRadius)
88
- var y1 = -1; else
89
- var y1 = (Math.floor(Math.sqrt(Math.pow(borderRadius, 2) - Math.pow((intx+1), 2))) - 1); if(borderRadius != j)
90
- { if((intx) >= borderRadius)
91
- var y2 = -1; else
92
- var y2 = Math.ceil(Math.sqrt(Math.pow(borderRadius,2) - Math.pow(intx, 2))); if((intx+1) >= j)
93
- var y3 = -1; else
94
- var y3 = (Math.floor(Math.sqrt(Math.pow(j ,2) - Math.pow((intx+1), 2))) - 1);}
95
- if((intx) >= j)
96
- var y4 = -1; else
97
- var y4 = Math.ceil(Math.sqrt(Math.pow(j ,2) - Math.pow(intx, 2))); if(y1 > -1) this.drawPixel(intx, 0, this.boxColour, 100, (y1+1), newCorner, -1, this.settings[cc].radius); if(borderRadius != j)
98
- { for(var inty = (y1 + 1); inty < y2; inty++)
99
- { if(this.settings.antiAlias)
100
- { if(this.backgroundImage != "")
101
- { var borderFract = (pixelFraction(intx, inty, borderRadius) * 100); if(borderFract < 30)
102
- { this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, 0, this.settings[cc].radius);}
103
- else
104
- { this.drawPixel(intx, inty, this.borderColour, 100, 1, newCorner, -1, this.settings[cc].radius);}
105
- }
106
- else
107
- { var pixelcolour = BlendColour(this.boxColour, this.borderColour, pixelFraction(intx, inty, borderRadius)); this.drawPixel(intx, inty, pixelcolour, 100, 1, newCorner, 0, this.settings[cc].radius, cc);}
108
- }
109
- }
110
- if(this.settings.antiAlias)
111
- { if(y3 >= y2)
112
- { if (y2 == -1) y2 = 0; this.drawPixel(intx, y2, this.borderColour, 100, (y3 - y2 + 1), newCorner, 0, 0);}
113
- }
114
- else
115
- { if(y3 >= y1)
116
- { this.drawPixel(intx, (y1 + 1), this.borderColour, 100, (y3 - y1), newCorner, 0, 0);}
117
- }
118
- var outsideColour = this.borderColour;}
119
- else
120
- { var outsideColour = this.boxColour; var y3 = y1;}
121
- if(this.settings.antiAlias)
122
- { for(var inty = (y3 + 1); inty < y4; inty++)
123
- { this.drawPixel(intx, inty, outsideColour, (pixelFraction(intx, inty , j) * 100), 1, newCorner, ((this.borderWidth > 0)? 0 : -1), this.settings[cc].radius);}
124
- }
125
- }
126
- this.masterCorners[this.settings[cc].radius] = newCorner.cloneNode(true);}
127
- if(cc != "br")
128
- { for(var t = 0, k = newCorner.childNodes.length; t < k; t++)
129
- { var pixelBar = newCorner.childNodes[t]; var pixelBarTop = parseInt(pixelBar.style.top.substring(0, pixelBar.style.top.indexOf("px"))); var pixelBarLeft = parseInt(pixelBar.style.left.substring(0, pixelBar.style.left.indexOf("px"))); var pixelBarHeight = parseInt(pixelBar.style.height.substring(0, pixelBar.style.height.indexOf("px"))); if(cc == "tl" || cc == "bl"){ pixelBar.style.left = this.settings[cc].radius -pixelBarLeft -1 + "px";}
130
- if(cc == "tr" || cc == "tl"){ pixelBar.style.top = this.settings[cc].radius -pixelBarHeight -pixelBarTop + "px";}
131
- switch(cc)
132
- { case "tr":
133
- pixelBar.style.backgroundPosition = "-" + Math.abs((this.boxWidth - this.settings[cc].radius + this.borderWidth) + pixelBarLeft) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "tl":
134
- pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs(this.settings[cc].radius -pixelBarHeight -pixelBarTop - this.borderWidth) + "px"; break; case "bl":
135
- pixelBar.style.backgroundPosition = "-" + Math.abs((this.settings[cc].radius -pixelBarLeft -1) - this.borderWidth) + "px -" + Math.abs((this.boxHeight + this.settings[cc].radius + pixelBarTop) -this.borderWidth) + "px"; break;}
136
- }
137
- }
138
- }
139
- if(newCorner)
140
- { switch(cc)
141
- { case "tl":
142
- if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "tr":
143
- if(newCorner.style.position == "absolute") newCorner.style.top = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.topContainer) this.topContainer.appendChild(newCorner); break; case "bl":
144
- if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.left = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break; case "br":
145
- if(newCorner.style.position == "absolute") newCorner.style.bottom = "0px"; if(newCorner.style.position == "absolute") newCorner.style.right = "0px"; if(this.bottomContainer) this.bottomContainer.appendChild(newCorner); break;}
146
- }
147
- }
148
- }
149
- var radiusDiff = new Array(); radiusDiff["t"] = Math.abs(this.settings.tl.radius - this.settings.tr.radius)
150
- radiusDiff["b"] = Math.abs(this.settings.bl.radius - this.settings.br.radius); for(z in radiusDiff)
151
- { if(z == "t" || z == "b")
152
- { if(radiusDiff[z])
153
- { var smallerCornerType = ((this.settings[z + "l"].radius < this.settings[z + "r"].radius)? z +"l" : z +"r"); var newFiller = document.createElement("DIV"); newFiller.style.height = radiusDiff[z] + "px"; newFiller.style.width = this.settings[smallerCornerType].radius+ "px"
154
- newFiller.style.position = "absolute"; newFiller.style.fontSize = "1px"; newFiller.style.overflow = "hidden"; newFiller.style.backgroundColor = this.boxColour; switch(smallerCornerType)
155
- { case "tl":
156
- newFiller.style.bottom = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.topContainer.appendChild(newFiller); break; case "tr":
157
- newFiller.style.bottom = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.topContainer.appendChild(newFiller); break; case "bl":
158
- newFiller.style.top = "0px"; newFiller.style.left = "0px"; newFiller.style.borderLeft = this.borderString; this.bottomContainer.appendChild(newFiller); break; case "br":
159
- newFiller.style.top = "0px"; newFiller.style.right = "0px"; newFiller.style.borderRight = this.borderString; this.bottomContainer.appendChild(newFiller); break;}
160
- }
161
- var newFillerBar = document.createElement("DIV"); newFillerBar.style.position = "relative"; newFillerBar.style.fontSize = "1px"; newFillerBar.style.overflow = "hidden"; newFillerBar.style.backgroundColor = this.boxColour; newFillerBar.style.backgroundImage = this.backgroundImage; switch(z)
162
- { case "t":
163
- if(this.topContainer)
164
- { if(this.settings.tl.radius && this.settings.tr.radius)
165
- { newFillerBar.style.height = topMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.tl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.tr.radius - this.borderWidth + "px"; newFillerBar.style.borderTop = this.borderString; if(this.backgroundImage != "")
166
- newFillerBar.style.backgroundPosition = "-" + (topMaxRadius + this.borderWidth) + "px 0px"; this.topContainer.appendChild(newFillerBar);}
167
- this.box.style.backgroundPosition = "0px -" + (topMaxRadius - this.borderWidth) + "px";}
168
- break; case "b":
169
- if(this.bottomContainer)
170
- { if(this.settings.bl.radius && this.settings.br.radius)
171
- { newFillerBar.style.height = botMaxRadius - this.borderWidth + "px"; newFillerBar.style.marginLeft = this.settings.bl.radius - this.borderWidth + "px"; newFillerBar.style.marginRight = this.settings.br.radius - this.borderWidth + "px"; newFillerBar.style.borderBottom = this.borderString; if(this.backgroundImage != "")
172
- newFillerBar.style.backgroundPosition = "-" + (botMaxRadius + this.borderWidth) + "px -" + (this.boxHeight + (topMaxRadius + this.borderWidth)) + "px"; this.bottomContainer.appendChild(newFillerBar);}
173
- }
174
- break;}
175
- }
176
- }
177
- if(this.settings.autoPad == true && this.boxPadding > 0)
178
- { var contentContainer = document.createElement("DIV"); contentContainer.style.position = "relative"; contentContainer.innerHTML = this.boxContent; contentContainer.className = "autoPadDiv"; var topPadding = Math.abs(topMaxRadius - this.boxPadding); var botPadding = Math.abs(botMaxRadius - this.boxPadding); if(topMaxRadius < this.boxPadding)
179
- contentContainer.style.paddingTop = topPadding + "px"; if(botMaxRadius < this.boxPadding)
180
- contentContainer.style.paddingBottom = botMaxRadius + "px"; contentContainer.style.paddingLeft = this.boxPadding + "px"; contentContainer.style.paddingRight = this.boxPadding + "px"; this.contentDIV = this.box.appendChild(contentContainer);}
181
- }
182
- this.drawPixel = function(intx, inty, colour, transAmount, height, newCorner, image, cornerRadius)
183
- { var pixel = document.createElement("DIV"); pixel.style.height = height + "px"; pixel.style.width = "1px"; pixel.style.position = "absolute"; pixel.style.fontSize = "1px"; pixel.style.overflow = "hidden"; var topMaxRadius = Math.max(this.settings["tr"].radius, this.settings["tl"].radius); if(image == -1 && this.backgroundImage != "")
184
- { pixel.style.backgroundImage = this.backgroundImage; pixel.style.backgroundPosition = "-" + (this.boxWidth - (cornerRadius - intx) + this.borderWidth) + "px -" + ((this.boxHeight + topMaxRadius + inty) -this.borderWidth) + "px";}
185
- else
186
- { pixel.style.backgroundColor = colour;}
187
- if (transAmount != 100)
188
- setOpacity(pixel, transAmount); pixel.style.top = inty + "px"; pixel.style.left = intx + "px"; newCorner.appendChild(pixel);}
189
- }
190
- function insertAfter(parent, node, referenceNode)
191
- { parent.insertBefore(node, referenceNode.nextSibling);}
192
- function BlendColour(Col1, Col2, Col1Fraction)
193
- { var red1 = parseInt(Col1.substr(1,2),16); var green1 = parseInt(Col1.substr(3,2),16); var blue1 = parseInt(Col1.substr(5,2),16); var red2 = parseInt(Col2.substr(1,2),16); var green2 = parseInt(Col2.substr(3,2),16); var blue2 = parseInt(Col2.substr(5,2),16); if(Col1Fraction > 1 || Col1Fraction < 0) Col1Fraction = 1; var endRed = Math.round((red1 * Col1Fraction) + (red2 * (1 - Col1Fraction))); if(endRed > 255) endRed = 255; if(endRed < 0) endRed = 0; var endGreen = Math.round((green1 * Col1Fraction) + (green2 * (1 - Col1Fraction))); if(endGreen > 255) endGreen = 255; if(endGreen < 0) endGreen = 0; var endBlue = Math.round((blue1 * Col1Fraction) + (blue2 * (1 - Col1Fraction))); if(endBlue > 255) endBlue = 255; if(endBlue < 0) endBlue = 0; return "#" + IntToHex(endRed)+ IntToHex(endGreen)+ IntToHex(endBlue);}
194
- function IntToHex(strNum)
195
- { base = strNum / 16; rem = strNum % 16; base = base - (rem / 16); baseS = MakeHex(base); remS = MakeHex(rem); return baseS + '' + remS;}
196
- function MakeHex(x)
197
- { if((x >= 0) && (x <= 9))
198
- { return x;}
199
- else
200
- { switch(x)
201
- { case 10: return "A"; case 11: return "B"; case 12: return "C"; case 13: return "D"; case 14: return "E"; case 15: return "F";}
202
- }
203
- }
204
- function pixelFraction(x, y, r)
205
- { var pixelfraction = 0; var xvalues = new Array(1); var yvalues = new Array(1); var point = 0; var whatsides = ""; var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x,2))); if ((intersect >= y) && (intersect < (y+1)))
206
- { whatsides = "Left"; xvalues[point] = 0; yvalues[point] = intersect - y; point = point + 1;}
207
- var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y+1,2))); if ((intersect >= x) && (intersect < (x+1)))
208
- { whatsides = whatsides + "Top"; xvalues[point] = intersect - x; yvalues[point] = 1; point = point + 1;}
209
- var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(x+1,2))); if ((intersect >= y) && (intersect < (y+1)))
210
- { whatsides = whatsides + "Right"; xvalues[point] = 1; yvalues[point] = intersect - y; point = point + 1;}
211
- var intersect = Math.sqrt((Math.pow(r,2) - Math.pow(y,2))); if ((intersect >= x) && (intersect < (x+1)))
212
- { whatsides = whatsides + "Bottom"; xvalues[point] = intersect - x; yvalues[point] = 0;}
213
- switch (whatsides)
214
- { case "LeftRight":
215
- pixelfraction = Math.min(yvalues[0],yvalues[1]) + ((Math.max(yvalues[0],yvalues[1]) - Math.min(yvalues[0],yvalues[1]))/2); break; case "TopRight":
216
- pixelfraction = 1-(((1-xvalues[0])*(1-yvalues[1]))/2); break; case "TopBottom":
217
- pixelfraction = Math.min(xvalues[0],xvalues[1]) + ((Math.max(xvalues[0],xvalues[1]) - Math.min(xvalues[0],xvalues[1]))/2); break; case "LeftBottom":
218
- pixelfraction = (yvalues[0]*xvalues[1])/2; break; default:
219
- pixelfraction = 1;}
220
- return pixelfraction;}
221
- function rgb2Hex(rgbColour)
222
- { try{ var rgbArray = rgb2Array(rgbColour); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); var hexColour = "#" + IntToHex(red) + IntToHex(green) + IntToHex(blue);}
223
- catch(e){ alert("There was an error converting the RGB value to Hexadecimal in function rgb2Hex");}
224
- return hexColour;}
225
- function rgb2Array(rgbColour)
226
- { var rgbValues = rgbColour.substring(4, rgbColour.indexOf(")")); var rgbArray = rgbValues.split(", "); return rgbArray;}
227
- function setOpacity(obj, opacity)
228
- { opacity = (opacity == 100)?99.999:opacity; if(isSafari && obj.tagName != "IFRAME")
229
- { var rgbArray = rgb2Array(obj.style.backgroundColor); var red = parseInt(rgbArray[0]); var green = parseInt(rgbArray[1]); var blue = parseInt(rgbArray[2]); obj.style.backgroundColor = "rgba(" + red + ", " + green + ", " + blue + ", " + opacity/100 + ")";}
230
- else if(typeof(obj.style.opacity) != "undefined")
231
- { obj.style.opacity = opacity/100;}
232
- else if(typeof(obj.style.MozOpacity) != "undefined")
233
- { obj.style.MozOpacity = opacity/100;}
234
- else if(typeof(obj.style.filter) != "undefined")
235
- { obj.style.filter = "alpha(opacity:" + opacity + ")";}
236
- else if(typeof(obj.style.KHTMLOpacity) != "undefined")
237
- { obj.style.KHTMLOpacity = opacity/100;}
238
- }
239
- function inArray(array, value)
240
- { for(var i = 0; i < array.length; i++){ if (array[i] === value) return i;}
241
- return false;}
242
- function inArrayKey(array, value)
243
- { for(key in array){ if(key === value) return true;}
244
- return false;}
245
- function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture); return true;}
246
- else if (elm.attachEvent) { var r = elm.attachEvent('on' + evType, fn); return r;}
247
- else { elm['on' + evType] = fn;}
248
- }
249
- function removeEvent(obj, evType, fn, useCapture){ if (obj.removeEventListener){ obj.removeEventListener(evType, fn, useCapture); return true;} else if (obj.detachEvent){ var r = obj.detachEvent("on"+evType, fn); return r;} else { alert("Handler could not be removed");}
250
- }
251
- function format_colour(colour)
252
- { var returnColour = "#ffffff"; if(colour != "" && colour != "transparent")
253
- { if(colour.substr(0, 3) == "rgb")
254
- { returnColour = rgb2Hex(colour);}
255
- else if(colour.length == 4)
256
- { returnColour = "#" + colour.substring(1, 2) + colour.substring(1, 2) + colour.substring(2, 3) + colour.substring(2, 3) + colour.substring(3, 4) + colour.substring(3, 4);}
257
- else
258
- { returnColour = colour;}
259
- }
260
- return returnColour;}
261
- function get_style(obj, property, propertyNS)
262
- { try
263
- { if(obj.currentStyle)
264
- { var returnVal = eval("obj.currentStyle." + property);}
265
- else
266
- { if(isSafari && obj.style.display == "none")
267
- { obj.style.display = ""; var wasHidden = true;}
268
- var returnVal = document.defaultView.getComputedStyle(obj, '').getPropertyValue(propertyNS); if(isSafari && wasHidden)
269
- { obj.style.display = "none";}
270
- }
271
- }
272
- catch(e)
273
- { }
274
- return returnVal;}
275
- function getElementsByClass(searchClass, node, tag)
276
- { var classElements = new Array(); if(node == null)
277
- node = document; if(tag == null)
278
- tag = '*'; var els = node.getElementsByTagName(tag); var elsLen = els.length; var pattern = new RegExp("(^|\s)"+searchClass+"(\s|$)"); for (i = 0, j = 0; i < elsLen; i++)
279
- { if(pattern.test(els[i].className))
280
- { classElements[j] = els[i]; j++;}
281
- }
282
- return classElements;}
283
- function newCurvyError(errorMessage)
284
- { return new Error("curvyCorners Error:\n" + errorMessage)
285
- }
@@ -1,138 +0,0 @@
1
- body {
2
- background-color: #E1D1F1;
3
- font-family: "Georgia", sans-serif;
4
- font-size: 16px;
5
- line-height: 1.6em;
6
- padding: 1.6em 0 0 0;
7
- color: #333;
8
- }
9
- h1, h2, h3, h4, h5, h6 {
10
- color: #444;
11
- }
12
- h1 {
13
- font-family: sans-serif;
14
- font-weight: normal;
15
- font-size: 4em;
16
- line-height: 0.8em;
17
- letter-spacing: -0.1ex;
18
- margin: 5px;
19
- }
20
- li {
21
- padding: 0;
22
- margin: 0;
23
- list-style-type: square;
24
- }
25
- a {
26
- color: #5E5AFF;
27
- background-color: #DAC;
28
- font-weight: normal;
29
- text-decoration: underline;
30
- }
31
- blockquote {
32
- font-size: 90%;
33
- font-style: italic;
34
- border-left: 1px solid #111;
35
- padding-left: 1em;
36
- }
37
- .caps {
38
- font-size: 80%;
39
- }
40
-
41
- #main {
42
- width: 45em;
43
- padding: 0;
44
- margin: 0 auto;
45
- }
46
- .coda {
47
- text-align: right;
48
- color: #77f;
49
- font-size: smaller;
50
- }
51
-
52
- table {
53
- font-size: 90%;
54
- line-height: 1.4em;
55
- color: #ff8;
56
- background-color: #111;
57
- padding: 2px 10px 2px 10px;
58
- border-style: dashed;
59
- }
60
-
61
- th {
62
- color: #fff;
63
- }
64
-
65
- td {
66
- padding: 2px 10px 2px 10px;
67
- }
68
-
69
- .success {
70
- color: #0CC52B;
71
- }
72
-
73
- .failed {
74
- color: #E90A1B;
75
- }
76
-
77
- .unknown {
78
- color: #995000;
79
- }
80
- pre, code {
81
- font-family: monospace;
82
- font-size: 90%;
83
- line-height: 1.4em;
84
- color: #ff8;
85
- background-color: #111;
86
- padding: 2px 10px 2px 10px;
87
- }
88
- .comment { color: #aaa; font-style: italic; }
89
- .keyword { color: #eff; font-weight: bold; }
90
- .punct { color: #eee; font-weight: bold; }
91
- .symbol { color: #0bb; }
92
- .string { color: #6b4; }
93
- .ident { color: #ff8; }
94
- .constant { color: #66f; }
95
- .regex { color: #ec6; }
96
- .number { color: #F99; }
97
- .expr { color: #227; }
98
-
99
- #version {
100
- float: right;
101
- text-align: right;
102
- font-family: sans-serif;
103
- font-weight: normal;
104
- background-color: #B3ABFF;
105
- color: #141331;
106
- padding: 15px 20px 10px 20px;
107
- margin: 0 auto;
108
- margin-top: 15px;
109
- border: 3px solid #141331;
110
- }
111
-
112
- #version .numbers {
113
- display: block;
114
- font-size: 4em;
115
- line-height: 0.8em;
116
- letter-spacing: -0.1ex;
117
- margin-bottom: 15px;
118
- }
119
-
120
- #version p {
121
- text-decoration: none;
122
- color: #141331;
123
- background-color: #B3ABFF;
124
- margin: 0;
125
- padding: 0;
126
- }
127
-
128
- #version a {
129
- text-decoration: none;
130
- color: #141331;
131
- background-color: #B3ABFF;
132
- }
133
-
134
- .clickable {
135
- cursor: pointer;
136
- cursor: hand;
137
- }
138
-
@@ -1,48 +0,0 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
- <head>
5
- <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
- <title>
8
- <%= title %>
9
- </title>
10
- <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
- <style>
12
-
13
- </style>
14
- <script type="text/javascript">
15
- window.onload = function() {
16
- settings = {
17
- tl: { radius: 10 },
18
- tr: { radius: 10 },
19
- bl: { radius: 10 },
20
- br: { radius: 10 },
21
- antiAlias: true,
22
- autoPad: true,
23
- validTags: ["div"]
24
- }
25
- var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
- versionBox.applyCornersToAll();
27
- }
28
- </script>
29
- </head>
30
- <body>
31
- <div id="main">
32
-
33
- <h1><%= title %></h1>
34
- <div id="version" class="clickable" onclick='document.location = "<%= download %>"; return false'>
35
- <p>Get Version</p>
36
- <a href="<%= download %>" class="numbers"><%= version %></a>
37
- </div>
38
- <%= body %>
39
- <p class="coda">
40
- <a href="FIXME email">FIXME full name</a>, <%= modified.pretty %><br>
41
- Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
42
- </p>
43
- </div>
44
-
45
- <!-- insert site tracking codes here, like Google Urchin -->
46
-
47
- </body>
48
- </html>