njacobeus-tokboxer 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ == 0.1.2 2008-11-27
2
+
3
+ * VMail objects now hold both the message id and the vmail id
4
+ * Added basic exception management
5
+
1
6
  == 0.1.1 2008-11-26
2
7
 
3
8
  * Fixed config problem causing missing files in the gem
data/Manifest.txt CHANGED
@@ -1,24 +1,15 @@
1
1
  History.txt
2
2
  Manifest.txt
3
- PostInstall.txt
4
3
  README.rdoc
5
4
  Rakefile
6
- config/website.yml.sample
7
5
  lib/TokBoxer.rb
8
6
  lib/TokBoxer/Api.rb
9
7
  lib/TokBoxer/Call.rb
8
+ lib/TokBoxer/Exceptions.rb
10
9
  lib/TokBoxer/User.rb
11
10
  lib/TokBoxer/VMail.rb
12
- script/console
13
- script/destroy
14
- script/generate
15
- script/txt2html
16
11
  spec/TokBoxer_spec.rb
17
12
  spec/spec.opts
18
13
  spec/spec_helper.rb
19
14
  tasks/rspec.rake
20
- website/index.html
21
- website/index.txt
22
- website/javascripts/rounded_corners_lite.inc.js
23
- website/stylesheets/screen.css
24
- website/template.html.erb
15
+ tokboxer.gemspec
data/lib/TokBoxer.rb CHANGED
@@ -11,7 +11,7 @@ require 'xmlsimple'
11
11
  require 'pp' # just for debugging purposes
12
12
 
13
13
  module TokBoxer
14
- VERSION = '0.1.1'
14
+ VERSION = '0.1.2'
15
15
 
16
16
  API_SERVER_LOGIN_URL = "view/oauth&"
17
17
  API_SERVER_METHODS_URL = "a/v0"
@@ -25,4 +25,5 @@ end
25
25
  require 'TokBoxer/Api'
26
26
  require 'TokBoxer/User'
27
27
  require 'TokBoxer/Call'
28
- require 'TokBoxer/VMail'
28
+ require 'TokBoxer/VMail'
29
+ require 'TokBoxer/Exceptions'
data/lib/TokBoxer/Api.rb CHANGED
@@ -155,7 +155,7 @@ module TokBoxer
155
155
  params = { :partnerKey => @api_key }
156
156
  result = request(method, call, params, @api_secret)
157
157
  if result['error']
158
- return nil # error
158
+ raise UnknownException, result['error'].inspect
159
159
  else
160
160
  return create_user(result["createGuest"].first["jabberId"].first, result["createGuest"].first["secret"].first)
161
161
  end
@@ -167,7 +167,8 @@ module TokBoxer
167
167
  params = { :firstname => firstname, :lastname => lastname, :email => email }
168
168
  result = request(method, call, params, @api_secret)
169
169
  if result['error']
170
- return nil # error
170
+ raise EmailAlreadyInUseException if result['error'].first['content'] == "That email is already in use" # error
171
+ raise UnknownException, result['error'].inspect
171
172
  else
172
173
  return create_user(result["registerUser"].first["jabberId"].first, result["registerUser"].first["secret"].first)
173
174
  end
@@ -227,10 +228,11 @@ module TokBoxer
227
228
 
228
229
  private # ==========================================================================================
229
230
 
230
- def initialize(api_key, api_secret, api_server_url = 'http://sandbox.tokbox.com/')
231
+ def initialize(api_key, api_secret, api_server_url = 'http://sandbox.tokbox.com/', debug = false)
231
232
  @api_key = api_key
232
233
  @api_secret = api_secret
233
234
  @api_server_url = api_server_url
235
+ @debug = debug
234
236
  end
235
237
 
236
238
  def generate_nonce
@@ -0,0 +1,4 @@
1
+ module TokBoxer
2
+ class EmailAlreadyInUseException < Exception; end;
3
+ class UnknownException < Exception; end;
4
+ end
data/lib/TokBoxer/User.rb CHANGED
@@ -1,24 +1,24 @@
1
1
  module TokBoxer
2
-
2
+
3
3
  class User
4
-
4
+
5
5
  attr_reader :jabberId, :secret
6
6
  alias :id :jabberId
7
-
7
+
8
8
  def initialize(jabberId, secret, api)
9
9
  @jabberId = jabberId
10
10
  @secret = secret
11
11
  @api = api
12
12
  self.login
13
13
  end
14
-
14
+
15
15
  # TODO add a method which calls get_request_token from the API
16
16
  # to get the jabberId and secret from the email and password
17
-
17
+
18
18
  def login
19
19
  @api.login_user(self.jabberId,self.secret)
20
20
  end
21
-
21
+
22
22
  def create_call(full_name,persistent=false)
23
23
  result = @api.create_call(@jabberId, full_name, persistent)
24
24
  if result['createCall'] and (createCall=result['createCall'].first)
@@ -32,41 +32,39 @@ module TokBoxer
32
32
  nil
33
33
  end
34
34
  end
35
-
35
+
36
36
  def access_token_valid?
37
37
  result = @api.validate_access_token(@jabberId, @secret)
38
38
  result['validateAccessToken'].first["isValid"].first == "true"
39
39
  end
40
-
40
+
41
41
  # Feeds ============================================================================================
42
-
42
+
43
+ protected
44
+
45
+ def build_vmails_array(what)
46
+ @api.get_feed(@jabberId,what)["feed"].first["item"].map do |m|
47
+ next unless m["videoMail"]
48
+ VMail.new :id => m["videoMail"].first["vmailId"],
49
+ :message_id => m["videoMail"].first["content"]["messageId"].first
50
+ end.compact
51
+ end
52
+
53
+ public
54
+
43
55
  def vmails
44
- @api.get_feed(@jabberId,"all")["feed"].first["item"].map do |m|
45
- VMail.new m["videoMail"].first["content"]["messageId"].first
46
- end
56
+ build_vmails_array("all")
47
57
  end
48
-
58
+
49
59
  def sent_vmails
50
- @api.get_feed(@jabberId,"vmailSent")["feed"].first["item"].map do |m|
51
- VMail.new m["videoMail"].first["content"]["messageId"].first
52
- end
60
+ build_vmails_array("vmailSent")
53
61
  end
54
-
62
+
55
63
  def received_vmails
56
- @api.get_feed(@jabberId,"vmailRecv")["feed"].first["item"].map do |m|
57
- VMail.new m["videoMail"].first["content"]["messageId"].first
58
- end
64
+ build_vmails_array("vmailRecv")
59
65
  end
60
-
66
+
61
67
  def recorder_embed_code(width="322", height="321",vmailToEmail="")
62
- # TODO: this comes from the PHP api. Not yet implemented here
63
- # if($isGuest) {
64
- # $apiObj = new TokBoxApi(API_Config::PARTNER_KEY, API_Config::PARTNER_SECRET);
65
- # $apiObj->updateToken($apiObj->getRequestToken(API_Config::CALLBACK_URL));
66
- #
67
- # $htmlCode .= "<script language=\"javascript\" src=\"SDK/js/TokBoxScript.js\"></script>\n";
68
- # $htmlCode .= "<body onclick=\"setToken('".$apiObj->getAuthToken()."');\">\n";
69
- # }
70
68
  <<-END
71
69
  <object width="#{width}" height="#{height}">
72
70
  <param name="movie" value="#{@api.api_server_url}#{API_SERVER_RECORDER_WIDGET}"></param>
@@ -105,33 +103,33 @@ module TokBoxer
105
103
  </object>
106
104
  END
107
105
  end
108
-
106
+
109
107
  def is_online?
110
108
  info["isOnline"].first == "true"
111
109
  end
112
-
110
+
113
111
  def display_name
114
112
  info["displayName"].first
115
113
  end
116
-
114
+
117
115
  def username
118
116
  info["username"].first
119
117
  end
120
-
118
+
121
119
  def userid
122
120
  info["userid"].first
123
121
  end
124
-
122
+
125
123
  def show
126
124
  info["show"].first
127
125
  end
128
-
126
+
129
127
  protected
130
-
128
+
131
129
  def info
132
130
  @info ||= @api.get_user_profile(self.jabberId)["getUserProfile"].first
133
131
  end
134
-
132
+
135
133
  end
136
-
134
+
137
135
  end
@@ -2,14 +2,15 @@ module TokBoxer
2
2
 
3
3
  class VMail
4
4
 
5
- attr_reader :id
5
+ attr_reader :id, :message_id
6
6
 
7
- def initialize(id)
8
- @id = id
7
+ def initialize(options={})
8
+ @id = options[:id]
9
+ @message_id = options[:message_id]
9
10
  end
10
11
 
11
12
  def to_s
12
- id
13
+ @id
13
14
  end
14
15
 
15
16
  end
data/tokboxer.gemspec ADDED
@@ -0,0 +1,38 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{tokboxer}
3
+ s.version = "0.1.2"
4
+
5
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
+ s.authors = ["Nicolas Jacobeus"]
7
+ s.date = %q{2008-11-27}
8
+ s.description = %q{This is a ruby implementation of the TokBox API. Tokbox is a free video calling / video mailing platform (see http://www.tokbox.com). All API methods specified in the Tokbox Developer API wiki (http://developers.tokbox.com/index.php/API) are implemented but not all objects yet. So you may have to dig into the hash returned by the call (XML converted to a Ruby hash). For the moment, this gem currently specifically serves our needs for the implementation of video conversations and video mails on iStockCV (www.istockcv.com), an online recruitment network which we are developing. Your needs may vary so feel free to contact me (nj@belighted.com).}
9
+ s.email = ["nj@belighted.com"]
10
+ s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc"]
11
+ s.files = ["History.txt", "Manifest.txt", "README.rdoc", "Rakefile", "lib/TokBoxer.rb", "lib/TokBoxer/Api.rb", "lib/TokBoxer/Call.rb", "lib/TokBoxer/Exceptions.rb", "lib/TokBoxer/User.rb", "lib/TokBoxer/VMail.rb", "spec/TokBoxer_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "tasks/rspec.rake", "tokboxer.gemspec"]
12
+ s.has_rdoc = true
13
+ s.homepage = %q{http://github.com/njacobeus/tokboxer/}
14
+ s.rdoc_options = ["--main", "README.rdoc"]
15
+ s.require_paths = ["lib"]
16
+ s.rubyforge_project = %q{tokboxer}
17
+ s.rubygems_version = %q{1.2.0}
18
+ s.summary = %q{This is a ruby implementation of the TokBox API}
19
+
20
+ if s.respond_to? :specification_version then
21
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
22
+ s.specification_version = 2
23
+
24
+ if current_version >= 3 then
25
+ s.add_runtime_dependency(%q<xml-simple>, [">= 1.0.11"])
26
+ s.add_development_dependency(%q<newgem>, [">= 1.0.5"])
27
+ s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
28
+ else
29
+ s.add_dependency(%q<xml-simple>, [">= 1.0.11"])
30
+ s.add_dependency(%q<newgem>, [">= 1.0.5"])
31
+ s.add_dependency(%q<hoe>, [">= 1.8.0"])
32
+ end
33
+ else
34
+ s.add_dependency(%q<xml-simple>, [">= 1.0.11"])
35
+ s.add_dependency(%q<newgem>, [">= 1.0.5"])
36
+ s.add_dependency(%q<hoe>, [">= 1.8.0"])
37
+ end
38
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: njacobeus-tokboxer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicolas Jacobeus
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-26 00:00:00 -08:00
12
+ date: 2008-11-27 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -49,34 +49,23 @@ extensions: []
49
49
  extra_rdoc_files:
50
50
  - History.txt
51
51
  - Manifest.txt
52
- - PostInstall.txt
53
52
  - README.rdoc
54
- - website/index.txt
55
53
  files:
56
54
  - History.txt
57
55
  - Manifest.txt
58
- - PostInstall.txt
59
56
  - README.rdoc
60
57
  - Rakefile
61
- - config/website.yml.sample
62
58
  - lib/TokBoxer.rb
63
59
  - lib/TokBoxer/Api.rb
64
60
  - lib/TokBoxer/Call.rb
61
+ - lib/TokBoxer/Exceptions.rb
65
62
  - lib/TokBoxer/User.rb
66
63
  - lib/TokBoxer/VMail.rb
67
- - script/console
68
- - script/destroy
69
- - script/generate
70
- - script/txt2html
71
64
  - spec/TokBoxer_spec.rb
72
65
  - spec/spec.opts
73
66
  - spec/spec_helper.rb
74
67
  - tasks/rspec.rake
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
68
+ - tokboxer.gemspec
80
69
  has_rdoc: true
81
70
  homepage: http://github.com/njacobeus/tokboxer/
82
71
  post_install_message:
data/PostInstall.txt DELETED
@@ -1,7 +0,0 @@
1
-
2
- For more information on TokBoxer, see http://TokBoxer.rubyforge.org
3
-
4
- NOTE: Change this information in PostInstall.txt
5
- You can also delete it if you don't want it.
6
-
7
-
@@ -1,2 +0,0 @@
1
- host: unknown@rubyforge.org
2
- remote_dir: /var/www/gforge-projects/TokBoxer
data/script/console DELETED
@@ -1,10 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # File: script/console
3
- irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
-
5
- libs = " -r irb/completion"
6
- # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
- # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
- libs << " -r #{File.dirname(__FILE__) + '/../lib/TokBoxer.rb'}"
9
- puts "Loading TokBoxer gem"
10
- exec "#{irb} #{libs} --simple-prompt"
data/script/destroy DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
- APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
-
4
- begin
5
- require 'rubigen'
6
- rescue LoadError
7
- require 'rubygems'
8
- require 'rubigen'
9
- end
10
- require 'rubigen/scripts/destroy'
11
-
12
- ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
- RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
- RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
- APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
-
4
- begin
5
- require 'rubigen'
6
- rescue LoadError
7
- require 'rubygems'
8
- require 'rubigen'
9
- end
10
- require 'rubigen/scripts/generate'
11
-
12
- ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
- RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
- RubiGen::Scripts::Generate.new.run(ARGV)
data/script/txt2html DELETED
@@ -1,71 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- load File.dirname(__FILE__) + "/../Rakefile"
4
- require 'rubyforge'
5
- require 'redcloth'
6
- require 'syntax/convertors/html'
7
- require 'erb'
8
-
9
- download = "http://rubyforge.org/projects/#{$hoe.rubyforge_name}"
10
- version = $hoe.version
11
-
12
- def rubyforge_project_id
13
- RubyForge.new.configure.autoconfig["group_ids"][$hoe.rubyforge_name]
14
- end
15
-
16
- class Fixnum
17
- def ordinal
18
- # teens
19
- return 'th' if (10..19).include?(self % 100)
20
- # others
21
- case self % 10
22
- when 1: return 'st'
23
- when 2: return 'nd'
24
- when 3: return 'rd'
25
- else return 'th'
26
- end
27
- end
28
- end
29
-
30
- class Time
31
- def pretty
32
- return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
33
- end
34
- end
35
-
36
- def convert_syntax(syntax, source)
37
- return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
38
- end
39
-
40
- if ARGV.length >= 1
41
- src, template = ARGV
42
- template ||= File.join(File.dirname(__FILE__), '/../website/template.html.erb')
43
- else
44
- puts("Usage: #{File.split($0).last} source.txt [template.html.erb] > output.html")
45
- exit!
46
- end
47
-
48
- template = ERB.new(File.open(template).read)
49
-
50
- title = nil
51
- body = nil
52
- File.open(src) do |fsrc|
53
- title_text = fsrc.readline
54
- body_text_template = fsrc.read
55
- body_text = ERB.new(body_text_template).result(binding)
56
- syntax_items = []
57
- body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
58
- ident = syntax_items.length
59
- element, syntax, source = $1, $2, $3
60
- syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
61
- "syntax-temp-#{ident}"
62
- }
63
- title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
64
- body = RedCloth.new(body_text).to_html
65
- body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
66
- end
67
- stat = File.stat(src)
68
- created = stat.ctime
69
- modified = stat.mtime
70
-
71
- $stdout << template.result(binding)
data/website/index.html DELETED
@@ -1,84 +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
- TokBoxer
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>TokBoxer</h1>
34
- <div class="sidebar">
35
- <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/tokboxer"; return false'>
36
- <p>Get Version</p>
37
- <a href="http://rubyforge.org/projects/tokboxer" class="numbers">0.1.0</a>
38
- </div>
39
- </div>
40
- <h2>What</h2>
41
- <h2>Installing</h2>
42
- <p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="constant">TokBoxer</span></pre></p>
43
- <h2>The basics</h2>
44
- <h2>Demonstration of usage</h2>
45
- <h2>Forum</h2>
46
- <p><a href="http://groups.google.com/group/TokBoxer">http://groups.google.com/group/TokBoxer</a></p>
47
- <p><span class="caps">TODO</span> &#8211; create Google Group &#8211; TokBoxer</p>
48
- <h2>How to submit patches</h2>
49
- <p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people&#8217;s code</a> and for section <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups">8b: Submit patch to Google Groups</a>, use the Google Group above.</p>
50
- <p><span class="caps">TODO</span> &#8211; pick <span class="caps">SVN</span> or Git instructions</p>
51
- <p>The trunk repository is <code>svn://rubyforge.org/var/svn/TokBoxer/trunk</code> for anonymous access.</p>
52
- <p><span class="caps">OOOORRRR</span></p>
53
- <p>You can fetch the source from either:</p>
54
- <ul>
55
- <li>rubyforge: <a href="http://rubyforge.org/scm/?group_id=7264">http://rubyforge.org/scm/?group_id=7264</a></li>
56
- </ul>
57
- <pre>git clone git://rubyforge.org/TokBoxer.git</pre>
58
- <ul>
59
- <li>github: <a href="http://github.com/GITHUB_USERNAME/TokBoxer/tree/master">http://github.com/GITHUB_USERNAME/TokBoxer/tree/master</a></li>
60
- </ul>
61
- <pre>git clone git://github.com/GITHUB_USERNAME/TokBoxer.git</pre>
62
- <p><span class="caps">TODO</span> &#8211; add &#8220;github_username: username&#8221; to ~/.rubyforge/user-config.yml and newgem will reuse it for future projects.</p>
63
- <ul>
64
- <li>gitorious: <a href="git://gitorious.org/TokBoxer/mainline.git">git://gitorious.org/TokBoxer/mainline.git</a></li>
65
- </ul>
66
- <pre>git clone git://gitorious.org/TokBoxer/mainline.git</pre>
67
- <h3>Build and test instructions</h3>
68
- <pre>cd TokBoxer
69
- rake test
70
- rake install_gem</pre>
71
- <h2>License</h2>
72
- <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
73
- <h2>Contact</h2>
74
- <p>Comments are welcome. Send an email to <a href="mailto:nj@belighted.com">Nicolas Jacobeus</a> via the <a href="http://groups.google.com/group/TokBoxer">forum</a></p>
75
- <p class="coda">
76
- <a href="nj@belighted.com">Nicolas Jacobeus</a>, 3rd November 2008<br>
77
- Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
78
- </p>
79
- </div>
80
-
81
- <!-- insert site tracking codes here, like Google Urchin -->
82
-
83
- </body>
84
- </html>
data/website/index.txt DELETED
@@ -1,81 +0,0 @@
1
- h1. TokBoxer
2
-
3
-
4
- h2. What
5
-
6
-
7
- h2. Installing
8
-
9
- <pre syntax="ruby">sudo gem install TokBoxer</pre>
10
-
11
- h2. The basics
12
-
13
-
14
- h2. Demonstration of usage
15
-
16
-
17
-
18
- h2. Forum
19
-
20
- "http://groups.google.com/group/TokBoxer":http://groups.google.com/group/TokBoxer
21
-
22
- TODO - create Google Group - TokBoxer
23
-
24
- h2. How to submit patches
25
-
26
- 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.
27
-
28
- TODO - pick SVN or Git instructions
29
-
30
- The trunk repository is <code>svn://rubyforge.org/var/svn/TokBoxer/trunk</code> for anonymous access.
31
-
32
- OOOORRRR
33
-
34
- You can fetch the source from either:
35
-
36
- <% if rubyforge_project_id %>
37
-
38
- * rubyforge: "http://rubyforge.org/scm/?group_id=<%= rubyforge_project_id %>":http://rubyforge.org/scm/?group_id=<%= rubyforge_project_id %>
39
-
40
- <pre>git clone git://rubyforge.org/TokBoxer.git</pre>
41
-
42
- <% else %>
43
-
44
- * rubyforge: MISSING IN ACTION
45
-
46
- TODO - You can not created a RubyForge project, OR have not run <code>rubyforge config</code>
47
- yet to refresh your local rubyforge data with this projects' id information.
48
-
49
- When you do this, this message will magically disappear!
50
-
51
- Or you can hack website/index.txt and make it all go away!!
52
-
53
- <% end %>
54
-
55
- * github: "http://github.com/GITHUB_USERNAME/TokBoxer/tree/master":http://github.com/GITHUB_USERNAME/TokBoxer/tree/master
56
-
57
- <pre>git clone git://github.com/GITHUB_USERNAME/TokBoxer.git</pre>
58
-
59
-
60
- TODO - add "github_username: username" to ~/.rubyforge/user-config.yml and newgem will reuse it for future projects.
61
-
62
-
63
- * gitorious: "git://gitorious.org/TokBoxer/mainline.git":git://gitorious.org/TokBoxer/mainline.git
64
-
65
- <pre>git clone git://gitorious.org/TokBoxer/mainline.git</pre>
66
-
67
- h3. Build and test instructions
68
-
69
- <pre>cd TokBoxer
70
- rake test
71
- rake install_gem</pre>
72
-
73
-
74
- h2. License
75
-
76
- This code is free to use under the terms of the MIT license.
77
-
78
- h2. Contact
79
-
80
- Comments are welcome. Send an email to "Nicolas Jacobeus":mailto:nj@belighted.com via the "forum":http://groups.google.com/group/TokBoxer
81
-
@@ -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,159 +0,0 @@
1
- body {
2
- background-color: #8DBD82;
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: #A1DDB1;
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: 55em;
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
- width: 40em;
87
- padding: 2px 10px 2px 10px;
88
- }
89
- .comment { color: #aaa; font-style: italic; }
90
- .keyword { color: #eff; font-weight: bold; }
91
- .punct { color: #eee; font-weight: bold; }
92
- .symbol { color: #0bb; }
93
- .string { color: #6b4; }
94
- .ident { color: #ff8; }
95
- .constant { color: #66f; }
96
- .regex { color: #ec6; }
97
- .number { color: #F99; }
98
- .expr { color: #227; }
99
-
100
- .sidebar {
101
- float: right;
102
- }
103
-
104
- #version {
105
- width: 217px;
106
- text-align: right;
107
- font-family: sans-serif;
108
- font-weight: normal;
109
- color: #141331;
110
- padding: 15px 20px 10px 20px;
111
- margin: 0 auto;
112
- margin-top: 15px;
113
- background-color: #9A5535;
114
- border: 3px solid #7E393E;
115
- }
116
-
117
- #version .numbers {
118
- display: block;
119
- font-size: 4em;
120
- line-height: 0.8em;
121
- letter-spacing: -0.1ex;
122
- margin-bottom: 15px;
123
- }
124
-
125
- #version p {
126
- text-decoration: none;
127
- color: #F1F4FF;
128
- background-color: #9A5535;
129
- margin: 0;
130
- padding: 0;
131
- }
132
-
133
- #version a {
134
- text-decoration: none;
135
- color: #F1F4FF;
136
- background-color: #9A5535;
137
- }
138
-
139
- .clickable {
140
- cursor: pointer;
141
- cursor: hand;
142
- }
143
-
144
- #twitter_search {
145
- margin: 40px 0 10px 15px;
146
- color: #F1F4FF;
147
- background-color: #9A5535;
148
- border: 3px solid #7E393E;
149
- }
150
-
151
- #twitter_search h3 {
152
- color: #F1F4FF;
153
- margin-bottom: 0px;
154
- }
155
-
156
- #twitter_search center b {
157
- display: none;
158
- }
159
-
@@ -1,50 +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 class="sidebar">
35
- <div id="version" class="clickable" onclick='document.location = "<%= download %>"; return false'>
36
- <p>Get Version</p>
37
- <a href="<%= download %>" class="numbers"><%= version %></a>
38
- </div>
39
- </div>
40
- <%= body %>
41
- <p class="coda">
42
- <a href="nj@belighted.com">Nicolas Jacobeus</a>, <%= modified.pretty %><br>
43
- Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
44
- </p>
45
- </div>
46
-
47
- <!-- insert site tracking codes here, like Google Urchin -->
48
-
49
- </body>
50
- </html>