andand 1.3.1 → 1.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +9 -0
- data/License.txt +0 -0
- data/{website/index.txt → README.textile} +40 -14
- data/lib/andand.rb +2 -2
- data/lib/andand/version.rb +1 -1
- data/test/andand_spec.rb +133 -0
- data/test/test_helper.rb +0 -0
- metadata +20 -40
- data/Manifest.txt +0 -24
- data/README.txt +0 -17
- data/Rakefile +0 -4
- data/config/hoe.rb +0 -70
- data/config/requirements.rb +0 -17
- data/log/debug.log +0 -0
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/script/txt2html +0 -74
- data/setup.rb +0 -1585
- data/tasks/deployment.rake +0 -34
- data/tasks/environment.rake +0 -7
- data/tasks/website.rake +0 -17
- data/test/test_andand.rb +0 -11
- data/website/index.html +0 -230
- data/website/javascripts/rounded_corners_lite.inc.js +0 -285
- data/website/stylesheets/screen.css +0 -138
- data/website/template.rhtml +0 -50
data/tasks/deployment.rake
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
desc 'Release the website and new gem version'
|
2
|
-
task :deploy => [:check_version, :website, :release] do
|
3
|
-
puts "Remember to create SVN tag:"
|
4
|
-
puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
|
5
|
-
"svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
|
6
|
-
puts "Suggested comment:"
|
7
|
-
puts "Tagging release #{CHANGES}"
|
8
|
-
end
|
9
|
-
|
10
|
-
desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
|
11
|
-
task :local_deploy => [:website_generate, :install_gem]
|
12
|
-
|
13
|
-
task :check_version do
|
14
|
-
unless ENV['VERSION']
|
15
|
-
puts 'Must pass a VERSION=x.y.z release version'
|
16
|
-
exit
|
17
|
-
end
|
18
|
-
unless ENV['VERSION'] == VERS
|
19
|
-
puts "Please update your version.rb to match the release version, currently #{VERS}"
|
20
|
-
exit
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
|
25
|
-
task :install_gem_no_doc => [:clean, :package] do
|
26
|
-
sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
|
27
|
-
end
|
28
|
-
|
29
|
-
namespace :manifest do
|
30
|
-
desc 'Recreate Manifest.txt to include ALL files'
|
31
|
-
task :refresh do
|
32
|
-
`rake check_manifest | patch -p0 > Manifest.txt`
|
33
|
-
end
|
34
|
-
end
|
data/tasks/environment.rake
DELETED
data/tasks/website.rake
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
desc 'Generate website files'
|
2
|
-
task :website_generate => :ruby_env do
|
3
|
-
(Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
|
4
|
-
sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
|
5
|
-
end
|
6
|
-
end
|
7
|
-
|
8
|
-
desc 'Upload website files to rubyforge'
|
9
|
-
task :website_upload do
|
10
|
-
host = "#{rubyforge_username}@rubyforge.org"
|
11
|
-
remote_dir = "/var/www/gforge-projects/#{PATH}/"
|
12
|
-
local_dir = 'website'
|
13
|
-
sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
|
14
|
-
end
|
15
|
-
|
16
|
-
desc 'Generate and upload website files'
|
17
|
-
task :website => [:website_generate, :website_upload, :publish_docs]
|
data/test/test_andand.rb
DELETED
data/website/index.html
DELETED
@@ -1,230 +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
|
-
Object#andand
|
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>Object#andand</h1>
|
34
|
-
<div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/andand"; return false'>
|
35
|
-
<p>Get Version</p>
|
36
|
-
<a href="http://rubyforge.org/projects/andand" class="numbers">1.3.1</a>
|
37
|
-
</div>
|
38
|
-
<h1>→ ‘andand’</h1>
|
39
|
-
|
40
|
-
|
41
|
-
<h2>What</h2>
|
42
|
-
|
43
|
-
|
44
|
-
<p><em>Object#andand</em> lets us write:</p>
|
45
|
-
|
46
|
-
|
47
|
-
<p><pre class='syntax'>
|
48
|
-
<span class="attribute">@phone</span> <span class="punct">=</span> <span class="constant">Location</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span><span class="symbol">:first</span><span class="punct">,</span> <span class="punct">...</span><span class="ident">elided</span><span class="punct">...</span> <span class="punct">).</span><span class="ident">andand</span><span class="punct">.</span><span class="ident">phone</span>
|
49
|
-
</pre>And get a <em>guarded method invocation</em> or <em>safe navigation method</em>. This snippet performs a <code>.find</code> on the Location class, then sends <code>.phone</code> to the result <em>if the result is not nil</em>. If the result is nil, then the expression returns nil without throwing a NoMethodError.</p>
|
50
|
-
|
51
|
-
|
52
|
-
<p>As Dejan Simic <a href="http://rors.org/2008/3/18/andand">put it</a>:</p>
|
53
|
-
|
54
|
-
|
55
|
-
<p>Why would you want to write this:</p>
|
56
|
-
|
57
|
-
|
58
|
-
<p><pre class='syntax'>
|
59
|
-
<span class="ident">entry</span><span class="punct">.</span><span class="ident">at</span><span class="punct">('</span><span class="string">description</span><span class="punct">')</span> <span class="punct">&&</span> <span class="ident">entry</span><span class="punct">.</span><span class="ident">at</span><span class="punct">('</span><span class="string">description</span><span class="punct">').</span><span class="ident">inner_text</span>
|
60
|
-
</pre>when you can write this:</p>
|
61
|
-
|
62
|
-
|
63
|
-
<p><pre class='syntax'>
|
64
|
-
<span class="ident">entry</span><span class="punct">.</span><span class="ident">at</span><span class="punct">('</span><span class="string">description</span><span class="punct">').</span><span class="ident">andand</span><span class="punct">.</span><span class="ident">inner_text</span>
|
65
|
-
</pre>Why indeed! As a bonus, install andand and you will also receive an enhanced Object#tap method, <em>at no extra charge</em>!</p>
|
66
|
-
|
67
|
-
|
68
|
-
<h2>Installing</h2>
|
69
|
-
|
70
|
-
|
71
|
-
<p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">andand</span></pre></p>
|
72
|
-
|
73
|
-
|
74
|
-
<h2>The basics</h2>
|
75
|
-
|
76
|
-
|
77
|
-
<h3>Object#andand</h3>
|
78
|
-
|
79
|
-
|
80
|
-
<p>Ruby programmers are familiar with the two <em>guarded assignment</em> operators <code>&&=</code> and <code>||=</code>. The typical use for them is when you have a variable that might be nil. For example:</p>
|
81
|
-
|
82
|
-
|
83
|
-
<p><pre class='syntax'>
|
84
|
-
<span class="ident">first_name</span> <span class="punct">&&=</span> <span class="attribute">@first_name</span><span class="punct">.</span><span class="ident">trim</span>
|
85
|
-
<span class="attribute">@phone</span> <span class="punct">||=</span> <span class="punct">'</span><span class="string">612-777-9311</span><span class="punct">'</span>
|
86
|
-
</pre>You are trimming the first name provided it isn’t nil, and you are assigning ‘612-777-9311’ to the phone if it <em>is</em> nil (or false, but that isn’t important right now). The other day we were discussing the guards and we agreed that we wished there was a <em>guarded method invocation</em> operator. Here’s an example of when you would use it:</p>
|
87
|
-
|
88
|
-
|
89
|
-
<p><pre class='syntax'>
|
90
|
-
<span class="attribute">@phone</span> <span class="punct">=</span> <span class="constant">Location</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span><span class="symbol">:first</span><span class="punct">,</span> <span class="punct">...</span><span class="ident">elided</span><span class="punct">...</span> <span class="punct">)&&.</span><span class="ident">phone</span>
|
91
|
-
</pre>Meaning, search the location table for the first record matching some criteria, and if you find a location, get its phone. If you don’t, get nil. (Groovy provides this exact functionality, although Groovy uses <code>?.</code> instead of <code>&&.</code>) However, <code>&&.</code> won’t work because <code>&&.</code> is not a real Ruby operator.</p>
|
92
|
-
|
93
|
-
|
94
|
-
<p>Object#andand let’s us write:</p>
|
95
|
-
|
96
|
-
|
97
|
-
<p><pre class='syntax'>
|
98
|
-
<span class="attribute">@phone</span> <span class="punct">=</span> <span class="constant">Location</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span><span class="symbol">:first</span><span class="punct">,</span> <span class="punct">...</span><span class="ident">elided</span><span class="punct">...</span> <span class="punct">).</span><span class="ident">andand</span><span class="punct">.</span><span class="ident">phone</span>
|
99
|
-
</pre>And get the same effect as:</p>
|
100
|
-
|
101
|
-
|
102
|
-
<p><pre class='syntax'>
|
103
|
-
<span class="attribute">@phone</span> <span class="punct">=</span> <span class="punct">->(</span><span class="ident">loc</span><span class="punct">){</span> <span class="ident">loc</span> <span class="punct">&&</span> <span class="ident">loc</span><span class="punct">.</span><span class="ident">phone</span> <span class="punct">}.</span><span class="ident">call</span><span class="punct">(</span><span class="constant">Location</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span><span class="symbol">:first</span><span class="punct">,</span> <span class="punct">...</span><span class="ident">elided</span><span class="punct">...</span> <span class="punct">))</span>
|
104
|
-
</pre>Note that because you accept any method using Ruby’s method invocation syntax, you can accept methods with parameters and/or blocks:</p>
|
105
|
-
|
106
|
-
|
107
|
-
<p><pre class='syntax'>
|
108
|
-
<span class="ident">list_of_lists</span><span class="punct">.</span><span class="ident">detect</span> <span class="punct">{</span> <span class="punct">...</span><span class="ident">elided</span><span class="punct">...</span> <span class="punct">}.</span><span class="ident">andand</span><span class="punct">.</span><span class="ident">inject</span><span class="punct">(</span><span class="number">42</span><span class="punct">)</span> <span class="punct">{</span> <span class="punct">...</span><span class="ident">elided</span> <span class="punct">...</span> <span class="punct">}</span>
|
109
|
-
</pre>Object#andand emphasizes syntactic regularity: the goal was to make an <code>&&.</code> operation that worked like <code>&&=</code>. <code>&&=</code> looks just like normal assignment, you can use any expression on the <span class="caps">RHS</span>, only the semantics are different. The andand method also works just like a normal method invocation, only the semantics are modified.</p>
|
110
|
-
|
111
|
-
|
112
|
-
<h3>Use andand to simplify your regular expression matching and extraction</h3>
|
113
|
-
|
114
|
-
|
115
|
-
<p>Do you ever find yourself wanting to extract a single value from a string using a regular expression? For example, Ruby’s Tempfile class creates paths to files that end in .pid.n (where pid is your process id and n is some number). Do you have a path that might be a tempfile and you want to obtain the base name?</p>
|
116
|
-
|
117
|
-
|
118
|
-
<p>Do you currently retrieve the MatchData object, check if it is nil, and get the first matching group if it isn’t? How about:</p>
|
119
|
-
|
120
|
-
|
121
|
-
<p><pre class='syntax'>
|
122
|
-
<span class="ident">require</span> <span class="punct">'</span><span class="string">tempfile</span><span class="punct">'</span>
|
123
|
-
<span class="ident">path</span> <span class="punct">=</span> <span class="constant">Tempfile</span><span class="punct">.</span><span class="ident">new</span><span class="punct">('</span><span class="string">foo.bar</span><span class="punct">').</span><span class="ident">path</span>
|
124
|
-
<span class="punct">=></span> <span class="punct">"</span><span class="string">/var/folders/UZ/UZyZsbVPEWqC7tTXrQBYGU+++TI/-Tmp-/foo.bar.1280.0</span><span class="punct">"</span>
|
125
|
-
<span class="ident">path</span><span class="punct">.</span><span class="ident">match</span><span class="punct">('</span><span class="string">/([^/]+)\.[0-9]+\.[0-9]+$</span><span class="punct">').</span><span class="ident">andand</span><span class="punct">[</span><span class="number">1</span><span class="punct">]</span>
|
126
|
-
<span class="punct">=></span> <span class="punct">"</span><span class="string">foo.bar</span><span class="punct">"</span>
|
127
|
-
</pre>With <code>.andand[1]</code>, you extract the group in the regular expression safely: if the expression matches, you get the group. If the expression fails to match, you get nil. Which is what you want, isn’t it? The contents of the group if the expression matches? Why should you need more than one line for something so simple?</p>
|
128
|
-
|
129
|
-
|
130
|
-
<h3>Enhanced Object#tap</h3>
|
131
|
-
|
132
|
-
|
133
|
-
<p>Ruby 1.9 introduces <a href="http://moonbase.rydia.net/mental/blog/programming/eavesdropping-on-expressions">Object#tap</a>. This library implements Object#tap for Ruby 1.8 <strong>and</strong> enhances it. As in Ruby 1.9, you can call <code>.tap</code> with a block:</p>
|
134
|
-
|
135
|
-
|
136
|
-
<p><pre class='syntax'>
|
137
|
-
<span class="ident">blah</span><span class="punct">.</span><span class="ident">sort</span><span class="punct">.</span><span class="ident">grep</span><span class="punct">(</span> <span class="punct">/</span><span class="regex">foo</span><span class="punct">/</span> <span class="punct">).</span><span class="ident">tap</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">xs</span><span class="punct">|</span> <span class="ident">p</span> <span class="ident">xs</span> <span class="punct">}.</span><span class="ident">map</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">x</span><span class="punct">|</span> <span class="ident">x</span><span class="punct">.</span><span class="ident">blah</span> <span class="punct">}</span>
|
138
|
-
</pre> But like its sibling <code>.andand</code>, you can now call <code>.tap</code> with a method as well:</p>
|
139
|
-
|
140
|
-
|
141
|
-
<p><pre class='syntax'>
|
142
|
-
<span class="punct">[</span><span class="number">1</span><span class="punct">,</span> <span class="number">2</span><span class="punct">,</span> <span class="number">3</span><span class="punct">,</span> <span class="number">4</span><span class="punct">,</span> <span class="number">5</span><span class="punct">].</span><span class="ident">tap</span><span class="punct">.</span><span class="ident">pop</span><span class="punct">.</span><span class="ident">map</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">n</span><span class="punct">|</span> <span class="ident">n</span> <span class="punct">*</span> <span class="number">2</span> <span class="punct">}</span>
|
143
|
-
<span class="punct">=></span> <span class="punct">[</span><span class="number">2</span><span class="punct">,</span> <span class="number">4</span><span class="punct">,</span> <span class="number">6</span><span class="punct">,</span> <span class="number">8</span><span class="punct">]</span>
|
144
|
-
</pre></p>
|
145
|
-
|
146
|
-
|
147
|
-
<h3>Doctor, it hurts when I do that</h3>
|
148
|
-
|
149
|
-
|
150
|
-
<p><em>So don’t do that!</em></p>
|
151
|
-
|
152
|
-
|
153
|
-
<p>The popular use case for Object#tap is poor man’s debugging:</p>
|
154
|
-
|
155
|
-
|
156
|
-
<p><pre class='syntax'>
|
157
|
-
<span class="ident">blah</span><span class="punct">.</span><span class="ident">sort</span><span class="punct">.</span><span class="ident">grep</span><span class="punct">(</span> <span class="punct">/</span><span class="regex">foo</span><span class="punct">/</span> <span class="punct">).</span><span class="ident">tap</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">xs</span><span class="punct">|</span> <span class="ident">p</span> <span class="ident">xs</span> <span class="punct">}.</span><span class="ident">map</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">x</span><span class="punct">|</span> <span class="ident">x</span><span class="punct">.</span><span class="ident">blah</span> <span class="punct">}</span>
|
158
|
-
</pre>Perhaps you want to remove the tap, you can delete it:</p>
|
159
|
-
|
160
|
-
|
161
|
-
<p><pre class='syntax'>
|
162
|
-
<span class="ident">blah</span><span class="punct">.</span><span class="ident">sort</span><span class="punct">.</span><span class="ident">grep</span><span class="punct">(</span> <span class="punct">/</span><span class="regex">foo</span><span class="punct">/</span> <span class="punct">).</span><span class="ident">map</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">x</span><span class="punct">|</span> <span class="ident">x</span><span class="punct">.</span><span class="ident">blah</span> <span class="punct">}</span>
|
163
|
-
</pre>Or, you can change it to <code>.dont</code>:</p>
|
164
|
-
|
165
|
-
|
166
|
-
<p><pre class='syntax'>
|
167
|
-
<span class="ident">blah</span><span class="punct">.</span><span class="ident">sort</span><span class="punct">.</span><span class="ident">grep</span><span class="punct">(</span> <span class="punct">/</span><span class="regex">foo</span><span class="punct">/</span> <span class="punct">).</span><span class="ident">dont</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">xs</span><span class="punct">|</span> <span class="ident">p</span> <span class="ident">xs</span> <span class="punct">}.</span><span class="ident">map</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">x</span><span class="punct">|</span> <span class="ident">x</span><span class="punct">.</span><span class="ident">blah</span> <span class="punct">}</span>
|
168
|
-
</pre>Like <code>.andand</code> and <code>.tap</code>, <code>.dont</code> works with arbitrary methods, not just blocks:</p>
|
169
|
-
|
170
|
-
|
171
|
-
<p><pre class='syntax'>
|
172
|
-
<span class="punct">(</span><span class="number">1</span><span class="punct">..</span><span class="number">10</span><span class="punct">).</span><span class="ident">to_a</span><span class="punct">.</span><span class="ident">reverse!</span>
|
173
|
-
<span class="punct">=></span> <span class="punct">[</span><span class="number">10</span><span class="punct">,</span> <span class="number">9</span><span class="punct">,</span> <span class="number">8</span><span class="punct">,</span> <span class="number">7</span><span class="punct">,</span> <span class="number">6</span><span class="punct">,</span> <span class="number">5</span><span class="punct">,</span> <span class="number">4</span><span class="punct">,</span> <span class="number">3</span><span class="punct">,</span> <span class="number">2</span><span class="punct">,</span> <span class="number">1</span><span class="punct">]</span>
|
174
|
-
<span class="punct">(</span><span class="number">1</span><span class="punct">..</span><span class="number">10</span><span class="punct">).</span><span class="ident">to_a</span><span class="punct">.</span><span class="ident">dont</span><span class="punct">.</span><span class="ident">reverse!</span>
|
175
|
-
<span class="punct">=></span> <span class="punct">[</span><span class="number">1</span><span class="punct">,</span> <span class="number">2</span><span class="punct">,</span> <span class="number">3</span><span class="punct">,</span> <span class="number">4</span><span class="punct">,</span> <span class="number">5</span><span class="punct">,</span> <span class="number">6</span><span class="punct">,</span> <span class="number">7</span><span class="punct">,</span> <span class="number">8</span><span class="punct">,</span> <span class="number">9</span><span class="punct">,</span> <span class="number">10</span><span class="punct">]</span>
|
176
|
-
</pre></p>
|
177
|
-
|
178
|
-
|
179
|
-
<h2>A little more background</h2>
|
180
|
-
|
181
|
-
|
182
|
-
<p><a href="http://weblog.raganwald.com/2008/01/objectandand-objectme-in-ruby.html">Object#andand & Object#me in Ruby</a> explains the original motivations, as well as providing links to similar implementations you may want to consider. A few people have pointed out that Object#andand is similar to Haskell’s Maybe monad. <a href="http://blog.pretheory.com/arch/2008/02/the_maybe_monad_in_ruby.php">The Maybe Monad in Ruby</a> is a good introduction for Ruby programmers.</p>
|
183
|
-
|
184
|
-
|
185
|
-
<h2>That’s cool, but…</h2>
|
186
|
-
|
187
|
-
|
188
|
-
<p>No problem, I get that andand isn’t exactly what you need. Have a look at the <a href="http://ick.rubyforge.org">Invocation Construction Kit</a> or “Ick.” The Ick gem <em>generalizes</em> #andand and #tap: Ick provides four useful ways to block-structure your code, the methods #let, #returning, #inside, and #my. Ick also includes four quasi-monadic invocations, #maybe, #please, #tee, and #fork.</p>
|
189
|
-
|
190
|
-
|
191
|
-
<p><a href="http://ick.rubyforge.org">Ick</a> provides abstractions for building your own invocations, so you can branch out and build some of your own abstractions with Ick’s building blocks.</p>
|
192
|
-
|
193
|
-
|
194
|
-
<h2>How to submit patches</h2>
|
195
|
-
|
196
|
-
|
197
|
-
<p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people’s code</a>.</p>
|
198
|
-
|
199
|
-
|
200
|
-
<p>The trunk repository is <code>svn://rubyforge.org/var/svn/andand/trunk</code> for anonymous access.</p>
|
201
|
-
|
202
|
-
|
203
|
-
<h2>License</h2>
|
204
|
-
|
205
|
-
|
206
|
-
<p>This code is free to use under the terms of the <a href="http://en.wikipedia.org/wiki/MIT_License"><span class="caps">MIT</span> license</a>.</p>
|
207
|
-
|
208
|
-
|
209
|
-
<h2>Shout Out</h2>
|
210
|
-
|
211
|
-
|
212
|
-
<p><a href="http://mcommons.com/">Mobile Commons</a>. Huge.</p>
|
213
|
-
|
214
|
-
|
215
|
-
<h2>Contact</h2>
|
216
|
-
|
217
|
-
|
218
|
-
<p>Comments are welcome. Send an email to <a href="mailto:raganwald+rubyforge@gmail.com">Reginald Braithwaite</a>.</p>
|
219
|
-
<p class="coda">
|
220
|
-
<a href="http://weblog.raganwald.com">Reginald Braithwaite</a>, 12th July 2008<br>
|
221
|
-
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
222
|
-
</p>
|
223
|
-
</div>
|
224
|
-
|
225
|
-
<!-- insert site tracking codes here, like Google Urchin -->
|
226
|
-
|
227
|
-
<div style="visibility: hidden"><script type="text/javascript" src="http://pub44.bravenet.com/counter/code.php?id=404723&usernum=3754613835&cpv=2"></script></div>
|
228
|
-
|
229
|
-
</body>
|
230
|
-
</html>
|
@@ -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
|
-
}
|