continuous4r 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. data/History.txt +4 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +83 -0
  4. data/README.txt +1 -0
  5. data/Rakefile +4 -0
  6. data/config/hoe.rb +71 -0
  7. data/config/requirements.rb +17 -0
  8. data/lib/capistrano_formatter.rb +19 -0
  9. data/lib/continuous4r/version.rb +9 -0
  10. data/lib/continuous4r.rb +490 -0
  11. data/lib/flog_formatter.rb +48 -0
  12. data/lib/heckle_formatter.rb +27 -0
  13. data/lib/httperf_formatter.rb +160 -0
  14. data/lib/site/body-capistrano.rhtml +8 -0
  15. data/lib/site/body-changelog.rhtml +8 -0
  16. data/lib/site/body-continuous4r-reports.rhtml +83 -0
  17. data/lib/site/body-dcov.rhtml +27 -0
  18. data/lib/site/body-dependencies.rhtml +52 -0
  19. data/lib/site/body-flog.rhtml +15 -0
  20. data/lib/site/body-heckle.rhtml +16 -0
  21. data/lib/site/body-httperf.rhtml +8 -0
  22. data/lib/site/body-index.rhtml +71 -0
  23. data/lib/site/body-issue-tracking.rhtml +38 -0
  24. data/lib/site/body-kwala.rhtml +35 -0
  25. data/lib/site/body-railroad.rhtml +29 -0
  26. data/lib/site/body-rcov.rhtml +23 -0
  27. data/lib/site/body-rdoc.rhtml +12 -0
  28. data/lib/site/body-scm-usage.rhtml +37 -0
  29. data/lib/site/body-stats.rhtml +8 -0
  30. data/lib/site/body-team-list.rhtml +73 -0
  31. data/lib/site/body-tests.rhtml +8 -0
  32. data/lib/site/body-zentest.rhtml +8 -0
  33. data/lib/site/header.rhtml +41 -0
  34. data/lib/site/images/continuous4r-logo.png +0 -0
  35. data/lib/site/images/external.png +0 -0
  36. data/lib/site/images/icon_error_sml.gif +0 -0
  37. data/lib/site/images/icon_success_sml.gif +0 -0
  38. data/lib/site/images/newwindow.png +0 -0
  39. data/lib/site/menu-capistrano.rhtml +23 -0
  40. data/lib/site/menu-changelog.rhtml +23 -0
  41. data/lib/site/menu-continuous4r-reports.rhtml +31 -0
  42. data/lib/site/menu-dcov.rhtml +23 -0
  43. data/lib/site/menu-dependencies.rhtml +19 -0
  44. data/lib/site/menu-flog.rhtml +23 -0
  45. data/lib/site/menu-heckle.rhtml +23 -0
  46. data/lib/site/menu-httperf.rhtml +23 -0
  47. data/lib/site/menu-index.rhtml +19 -0
  48. data/lib/site/menu-issue-tracking.rhtml +19 -0
  49. data/lib/site/menu-kwala.rhtml +23 -0
  50. data/lib/site/menu-railroad.rhtml +23 -0
  51. data/lib/site/menu-rcov.rhtml +23 -0
  52. data/lib/site/menu-rdoc.rhtml +23 -0
  53. data/lib/site/menu-scm-usage.rhtml +19 -0
  54. data/lib/site/menu-stats.rhtml +23 -0
  55. data/lib/site/menu-team-list.rhtml +19 -0
  56. data/lib/site/menu-tests.rhtml +23 -0
  57. data/lib/site/menu-zentest.rhtml +23 -0
  58. data/lib/site/style/commons-maven.css +113 -0
  59. data/lib/site/style/maven-base.css +151 -0
  60. data/lib/site/style/maven-theme.css +100 -0
  61. data/lib/site/style/project.css +1 -0
  62. data/lib/stats_formatter.rb +51 -0
  63. data/lib/subversion_extractor.rb +64 -0
  64. data/lib/tests_formatter.rb +65 -0
  65. data/lib/zen_test_formatter.rb +48 -0
  66. data/log/debug.log +0 -0
  67. data/script/destroy +14 -0
  68. data/script/destroy.cmd +1 -0
  69. data/script/generate +14 -0
  70. data/script/generate.cmd +1 -0
  71. data/script/txt2html +74 -0
  72. data/script/txt2html.cmd +1 -0
  73. data/setup.rb +1585 -0
  74. data/tasks/deployment.rake +34 -0
  75. data/tasks/environment.rake +7 -0
  76. data/tasks/website.rake +17 -0
  77. data/test/test_continuous4r.rb +11 -0
  78. data/test/test_helper.rb +2 -0
  79. data/website/index.html +411 -0
  80. data/website/index.txt +298 -0
  81. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  82. data/website/stylesheets/screen.css +138 -0
  83. data/website/template.rhtml +48 -0
  84. metadata +141 -0
data/website/index.txt ADDED
@@ -0,0 +1,298 @@
1
+ h1. continuous4r
2
+
3
+
4
+
5
+ h2. <br/>What is it ?
6
+
7
+ Continuous4R is a continuous integration tool for Ruby on Rails. With it, you can
8
+ aggregate reports of the best analysis, quality, tests and deployment tools for
9
+ Ruby and Rails.
10
+ By just defining one Rake task and writing an XML file describing your project,
11
+ Continuous4R builds for you an entire website in a Maven form.
12
+
13
+ h2. Installing
14
+
15
+ <pre syntax="ruby">sudo gem install continuous4r</pre>
16
+
17
+ h2. The basics
18
+
19
+ h3. Defining the Rake task
20
+
21
+ In order to build your project, you need to declare one Rake task. Under the lib/tasks
22
+ directory of your project, create a file named continuous4r.rake :
23
+
24
+ <pre syntax="ruby">require 'rubygems'
25
+ require 'continuous4r'
26
+
27
+ # Tache Rake pour la construction du site Continuous4R
28
+ namespace :continuous4r do
29
+ desc 'Build Continuous4R Website for the current project'
30
+ task :build do
31
+ Continuous4r.generate_site
32
+ end
33
+ end</pre>
34
+
35
+ h3. Writing the XML file describing your project
36
+
37
+ This file must be named continuous4r-project.xml, and must be placed at the top
38
+ of your Rails project directory. This file must not have a XML header (&lt;?xml version...).
39
+ Here's the model of this file :
40
+
41
+ <pre syntax="xml"><project name="PROJECT_NAME">
42
+ <description>PROJECT_DESCRIPTION</description>
43
+ <url>PROJECT_URL</url>
44
+ <logo>PROJECT_IMAGE_URI</logo>
45
+ <!-- Describing your project members -->
46
+ <members>
47
+ <member id="MEMBER_LOGIN" name="MEMBER_NAME" email="MEMBER_EMAIL"
48
+ roles="MEMBER_ROLES" company="MEMBER_COMPANY_NAME"/>
49
+ ...
50
+ </members>
51
+ <bugtracker>
52
+ <tracker_type>[Trac|Bugzilla|Mantis|etc...]</tracker_type>
53
+ <tracker_url>BUGTRACKER_URL</tracker_url>
54
+ <tracker_account_create>BUGTRACKER_URL_ACCOUNT_CREATION</tracker_account_create>
55
+ <search>BUGTRACKER_URL_SEARCH_TICKETS</search>
56
+ <url>BUGTRACKER_URL_TICKETS_LIST</url>
57
+ <add>BUGTRACKER_URL_TICKET_ADD</add>
58
+ </bugtracker>
59
+ <scm>
60
+ <repository_type>[svn|cvs]</repository_type>
61
+ <url>SCM_URL</url>
62
+ <view>SCM_VIEWER_URL</view>
63
+ <!-- needed if authentication for access is mandatory -->
64
+ <user>userlogin</user>
65
+ <password>userpassword</password>
66
+ </scm>
67
+ <!-- Gems mandatory for your project -->
68
+ <gems>
69
+ <gem name="GEM_NAME" version="GEM_VERSION"/>
70
+ ...
71
+ </gems>
72
+ <!-- Tasks in order to generate reports, described further -->
73
+ <tasks [autoinstall="true"] <!-- activates autoinstall for gems needed by tasks --> >
74
+ ...
75
+ </tasks>
76
+ </project></pre>
77
+
78
+ h2. Defining tasks
79
+
80
+ h3. Changelog task
81
+
82
+ Builds a report of the last modifications on the SCM repository. Only Subversion is supported
83
+ at the time.
84
+
85
+ <pre syntax="xml"><task name="changelog"/>
86
+ </pre>
87
+
88
+ <a href="changelog.png" target="_blank">Sample</a>
89
+
90
+ h3. Stats task
91
+
92
+ Generates a report of the Rails statistics on your project.
93
+
94
+ <pre syntax="xml"><task name="stats">
95
+ <description>Provides statistics on your Rails code</description>
96
+ </task></pre>
97
+
98
+ <a href="stats.png" target="_blank">Sample</a>
99
+
100
+ h3. Dcov task
101
+
102
+ Generates a report on the rdoc coverage of your Ruby code. The parts
103
+ which are not covered are colored in red.<br/>
104
+ The <strong>pattern</strong> param enables you to select the Ruby code to control.<br/>
105
+ The <strong>report</strong> param is the path where Continuous4R can find the dcov
106
+ original report (due to a bug in dcov).
107
+
108
+ <pre syntax="xml"><task name="dcov">
109
+ <description>Rdoc coverage analysis report</description>
110
+ <params>
111
+ <pattern value="app/**/*.rb"/>
112
+ <report path="coverage.html"/>
113
+ </params>
114
+ </task></pre>
115
+
116
+ <a href="dcov.png" target="_blank">Sample</a>
117
+
118
+ h3. Rcov task
119
+
120
+ Builds a report on the coverage of your tests over your Ruby code.
121
+
122
+ <pre syntax="xml"><task name="rcov">
123
+ <params>
124
+ <!-- file which loads all the necessary test files (based on requires) -->
125
+ <file path="test/rcov_test_all.rb"/>
126
+ <!-- path where to find the reports generated by rcov -->
127
+ <reports path="coverage"/>
128
+ </params>
129
+ </task>
130
+ </pre>
131
+
132
+ <a href="rcov.png" target="_blank">Sample</a>
133
+
134
+ h3. Rdoc task
135
+
136
+ Generates a report of the rdoc generation, and gives access to the rdoc.
137
+
138
+ <pre syntax="xml"><task name="rdoc"/>
139
+ </pre>
140
+
141
+ <a href="rdoc.png" target="_blank">Sample</a>
142
+
143
+ h3. Flog task
144
+
145
+ <a href="http://ruby.sadi.st/Flog.html" target="_blank">Flog</a> is a tool which
146
+ provides statistics of your Ruby code's complexity. This task generates an HTML
147
+ report of these statistics.
148
+
149
+ <pre syntax="xml"><task name="flog"/>
150
+ </pre>
151
+
152
+ <a href="flog.png" target="_blank">Sample</a>
153
+
154
+ h3. Kwala task
155
+
156
+ <a href="http://kwala.rubyforge.org" target="_blank">Kwala</a> is a continuous integration
157
+ tool which gathers informations of the quality and metrics on your project. This
158
+ task integrates the reports produced by kwala to the site.
159
+
160
+ <pre syntax="xml"><task name="kwala">
161
+ <params>
162
+ <!-- set of actions understood by kwala -->
163
+ <actions>
164
+ <action>loc</action>
165
+ <action>syntax_check</action>
166
+ <action>formatting</action>
167
+ <action>code_duplication</action>
168
+ <action>cyclomatic</action>
169
+ <action>unit_test</action>
170
+ <action>comment_check</action>
171
+ <action>requires</action>
172
+ <action>cycles</action>
173
+ </actions>
174
+ </params>
175
+ </task>
176
+ </pre>
177
+
178
+ <a href="kwala.png" target="_blank">Sample</a>
179
+
180
+ h3. Railroad task
181
+
182
+ Railroad is a tool to generate graphs of your models and/or your controllers. This
183
+ task generates your graphs and presents them on a HTML report. This task is not
184
+ compatible with CruiseControl.rb.
185
+
186
+ <pre syntax="xml"><task name="railroad">
187
+ <params>
188
+ <generate value="controllers|models|all"/>
189
+ </params>
190
+ </task>
191
+ </pre>
192
+
193
+ h3. Httperf task
194
+
195
+ <a href="http://www.hpl.hp.com/research/linux/httperf/" target="_blank">Httperf</a>
196
+ is a HTTP stress tool which generates text reports for a really important number
197
+ of statistics. This task generates a HTML report for these statistics.
198
+
199
+ <pre syntax="xml"><task name="httperf">
200
+ <params>
201
+ <!-- set of ports which will match Mongrel instances (all managed within) -->
202
+ <ports>
203
+ <port>3334</port>
204
+ </ports>
205
+ <processes>
206
+ <process port="3334" url="/controller/action?param=value"
207
+ requests="50" timeout="2">
208
+ <description>Stressing application with 50 requests (URL http://127.0.0.1:3334/controller/action?param=value),
209
+ with a timeout set to 2 seconds.</description>
210
+ </process>
211
+ <process port="3334" url="/controller/action?param=value"
212
+ sessions="10,5,2" rate="5" timeout="3">
213
+ <description>Stressing application with 10 sessions (URL http://127.0.0.1:3334/controller/action?param=value),
214
+ with a rate of 5 sessions per second. Each session consists
215
+ of 5 calls that are spaced out by 2 seconds. Timeout is set to 3 seconds.</description>
216
+ </process>
217
+ </processes>
218
+ </params>
219
+ </task>
220
+ </pre>
221
+
222
+ <a href="httperf.png" target="_blank">Sample</a>
223
+
224
+ h3. Tests task
225
+
226
+ Generates a report for the results of your tests.
227
+
228
+ <pre syntax="xml"><task name="tests">
229
+ <params>
230
+ <runner type="units"/><!-- equivalent to rake test:units -->
231
+ <runner type="functionals"/><!-- equivalent to rake test:functionals -->
232
+ <runner type="integration"/><!-- equivalent to rake test:integration -->
233
+ <runner type="rspec"/><!-- equivalent to rake spec -->
234
+ </params>
235
+ </task>
236
+ </pre>
237
+
238
+ <a href="tests.png" target="_blank">Sample</a>
239
+
240
+ h3. ZenTest task
241
+
242
+ ZenTest is a tool which generates Ruby code to show your test leaks. This task generates
243
+ a report to show where these leaks are.
244
+
245
+ <pre syntax="xml"><task name="zentest">
246
+ <params>
247
+ <!-- runs an analysis of the efficiency/exhaustiveness of the HomeControllerTest
248
+ test class against the HomeController class -->
249
+ <runner class="app/controllers/home_controller.rb" test="test/functional/home_controller_test.rb"/>
250
+ </params>
251
+ </task>
252
+ </pre>
253
+
254
+ <a href="zentest.png" target="_blank">Sample</a>
255
+
256
+ h3. Capistrano task
257
+
258
+ Generates reports for you Capistrano deployments.
259
+
260
+ <pre syntax="xml"><task name="capistrano">
261
+ <!-- set of runners for your Capistrano deployments -->
262
+ <params>
263
+ <runner task="deploy"/><!-- equivalent to 'cap deploy' -->
264
+ </params>
265
+ </task>
266
+ </pre>
267
+
268
+ <a href="capistrano.png" target="_blank">Sample</a>
269
+
270
+ h2. Demonstration of usage
271
+
272
+ When the XML file describing your project is written, you can build the Continuous4R
273
+ website by typing :
274
+
275
+ <pre syntax="shell">rake continuous4r:build</pre>
276
+
277
+ Now you can view the website generated for your project by lauching <strong>[project_folder]/continuous4r_build/index.html</strong>.
278
+
279
+ h2. Integration within CruiseControl.rb
280
+
281
+ Integration within CruiseControl.rb is quite simple. You just need to configure your
282
+ project to build task "rake continuous4r:build". When the build is done, go to the
283
+ detail page of the build, and click on the link below "Custom Build Artifacts".
284
+
285
+ h2. Help needed
286
+
287
+ This version 0.0.1 is a beta version of Continuous4r. I'm searching for volunteers
288
+ to work on this tool. With a more substancial amount of quality and work, this tool
289
+ could be REALLY GREAT.
290
+
291
+ h2. License
292
+
293
+ This code is free to use under the terms of the MIT license.
294
+
295
+ h2. Contact
296
+
297
+ Comments are welcome. Send an email to "Vincent Dubois":mailto:duboisv@hotmail.com,
298
+ or post a message on the <a href="http://rubyforge.org/forum/forum.php?forum_id=19721" target="_blank">forum</a>.
@@ -0,0 +1,285 @@
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
+ }