damagecontrol 0.5.0 → 0.5.0.1391
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.
- data/README +67 -11
- data/Rakefile +15 -6
- data/app/controllers/admin_controller.rb +0 -3
- data/app/controllers/application.rb +42 -163
- data/app/controllers/build_controller.rb +33 -0
- data/app/controllers/files_controller.rb +1 -1
- data/app/controllers/project_controller.rb +23 -65
- data/app/controllers/rails_ext.rb +247 -0
- data/app/controllers/rscm_ext.rb +52 -0
- data/app/helpers/build_helper.rb +2 -0
- data/app/views/build/email.rhtml +18 -0
- data/app/views/build/status.rhtml +20 -0
- data/app/views/build/tests.rhtml +2 -0
- data/app/views/layouts/{rscm.rhtml → default.rhtml} +10 -4
- data/app/views/project/_changesets_list.rhtml +2 -2
- data/app/views/project/_cvs.rhtml +4 -5
- data/app/views/project/_project.rhtml +9 -9
- data/app/views/project/_select_pane.rhtml +26 -0
- data/app/views/project/_tab_pane.rhtml +23 -0
- data/app/views/project/changeset.rhtml +35 -0
- data/app/views/project/view.rhtml +18 -32
- data/app/views/setup/welcome.rhtml +118 -0
- data/config/database.yml +20 -20
- data/config/environment.rb +66 -60
- data/config/environments/development.rb +3 -2
- data/config/environments/production.rb +3 -2
- data/config/environments/test.rb +3 -2
- data/config/routes.rb +15 -0
- data/lib/damagecontrol/app.rb +11 -40
- data/lib/damagecontrol/build.rb +50 -8
- data/lib/damagecontrol/directories.rb +7 -6
- data/lib/damagecontrol/poller.rb +11 -20
- data/lib/damagecontrol/project.rb +83 -16
- data/lib/damagecontrol/publisher/ambient_orb.rb +16 -0
- data/lib/damagecontrol/publisher/archive.rb +16 -0
- data/lib/damagecontrol/publisher/base.rb +25 -0
- data/lib/damagecontrol/publisher/build_duration.rb +16 -0
- data/lib/damagecontrol/publisher/email.rb +59 -0
- data/lib/damagecontrol/publisher/execute.rb +49 -0
- data/lib/damagecontrol/publisher/ftp.rb +16 -0
- data/lib/damagecontrol/publisher/growl.rb +44 -0
- data/lib/damagecontrol/publisher/irc.rb +31 -0
- data/lib/damagecontrol/publisher/jabber.rb +68 -0
- data/lib/damagecontrol/publisher/scp.rb +16 -0
- data/lib/damagecontrol/publisher/x10cm11a.rb +17 -0
- data/lib/damagecontrol/publisher/x10cm17a.rb +17 -0
- data/lib/damagecontrol/publisher/yahoo.rb +16 -0
- data/lib/damagecontrol/standard_persister.rb +2 -2
- data/lib/damagecontrol/tracker.rb +48 -6
- data/lib/damagecontrol/visitor/rss_writer.rb +1 -1
- data/lib/damagecontrol/visitor/yaml_persister.rb +10 -1
- data/public/404.html +5 -5
- data/public/500.html +5 -5
- data/public/dispatch.cgi +2 -2
- data/public/dispatch.fcgi +1 -1
- data/public/dispatch.rb +2 -2
- data/public/images/growlicon.png +0 -0
- data/public/images/megaphone.png +0 -0
- data/public/images/monotone-logo.png +0 -0
- data/public/images/publisher/ambient_orb.png +0 -0
- data/public/images/publisher/build_duration.png +0 -0
- data/public/images/publisher/email.png +0 -0
- data/public/images/publisher/execute.png +0 -0
- data/public/images/publisher/growl.png +0 -0
- data/public/images/publisher/irc.png +0 -0
- data/public/images/publisher/jabber.png +0 -0
- data/public/images/publisher/x10cm11a.png +0 -0
- data/public/images/publisher/x10cm17a.png +0 -0
- data/public/images/publisher/yahoo.png +0 -0
- data/public/index.html +70 -1
- data/public/javascripts/dateFormat.js +283 -0
- data/public/javascripts/jscalendar/ChangeLog +500 -0
- data/public/javascripts/jscalendar/README +33 -0
- data/public/javascripts/jscalendar/bugtest-hidden-selects.html +108 -0
- data/public/javascripts/jscalendar/calendar-blue.css +231 -0
- data/public/javascripts/jscalendar/calendar-blue2.css +235 -0
- data/public/javascripts/jscalendar/calendar-brown.css +224 -0
- data/public/javascripts/jscalendar/calendar-green.css +228 -0
- data/public/javascripts/jscalendar/calendar-setup.js +181 -0
- data/public/javascripts/jscalendar/calendar-setup_stripped.js +21 -0
- data/public/javascripts/jscalendar/calendar-system.css +250 -0
- data/public/javascripts/jscalendar/calendar-tas.css +238 -0
- data/public/javascripts/jscalendar/calendar-win2k-1.css +270 -0
- data/public/javascripts/jscalendar/calendar-win2k-2.css +270 -0
- data/public/javascripts/jscalendar/calendar-win2k-cold-1.css +264 -0
- data/public/javascripts/jscalendar/calendar-win2k-cold-2.css +270 -0
- data/public/javascripts/jscalendar/calendar.js +1715 -0
- data/public/javascripts/jscalendar/calendar.php +119 -0
- data/public/javascripts/jscalendar/calendar_stripped.js +12 -0
- data/public/javascripts/jscalendar/doc/html/reference-Z-S.css +0 -0
- data/public/javascripts/jscalendar/doc/html/reference.css +34 -0
- data/public/javascripts/jscalendar/doc/html/reference.html +1316 -0
- data/public/javascripts/jscalendar/doc/reference.pdf +0 -0
- data/public/javascripts/jscalendar/img.gif +0 -0
- data/public/javascripts/jscalendar/index.html +333 -0
- data/public/javascripts/jscalendar/lang/calendar-af.js +39 -0
- data/public/javascripts/jscalendar/lang/calendar-br.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-ca.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-cs-win.js +34 -0
- data/public/javascripts/jscalendar/lang/calendar-da.js +63 -0
- data/public/javascripts/jscalendar/lang/calendar-de.js +100 -0
- data/public/javascripts/jscalendar/lang/calendar-du.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-el.js +89 -0
- data/public/javascripts/jscalendar/lang/calendar-en.js +123 -0
- data/public/javascripts/jscalendar/lang/calendar-es.js +114 -0
- data/public/javascripts/jscalendar/lang/calendar-fi.js +98 -0
- data/public/javascripts/jscalendar/lang/calendar-fr.js +86 -0
- data/public/javascripts/jscalendar/lang/calendar-hr-utf8.js +49 -0
- data/public/javascripts/jscalendar/lang/calendar-hr.js +0 -0
- data/public/javascripts/jscalendar/lang/calendar-hu.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-it.js +79 -0
- data/public/javascripts/jscalendar/lang/calendar-jp.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-ko-utf8.js +120 -0
- data/public/javascripts/jscalendar/lang/calendar-ko.js +120 -0
- data/public/javascripts/jscalendar/lang/calendar-lt-utf8.js +114 -0
- data/public/javascripts/jscalendar/lang/calendar-lt.js +114 -0
- data/public/javascripts/jscalendar/lang/calendar-nl.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-no.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-pl-utf8.js +93 -0
- data/public/javascripts/jscalendar/lang/calendar-pl.js +56 -0
- data/public/javascripts/jscalendar/lang/calendar-pt.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-ro.js +66 -0
- data/public/javascripts/jscalendar/lang/calendar-ru.js +45 -0
- data/public/javascripts/jscalendar/lang/calendar-si.js +94 -0
- data/public/javascripts/jscalendar/lang/calendar-sk.js +99 -0
- data/public/javascripts/jscalendar/lang/calendar-sp.js +63 -0
- data/public/javascripts/jscalendar/lang/calendar-sv.js +93 -0
- data/public/javascripts/jscalendar/lang/calendar-tr.js +58 -0
- data/public/javascripts/jscalendar/lang/calendar-zh.js +45 -0
- data/public/javascripts/jscalendar/menuarrow.gif +0 -0
- data/public/javascripts/jscalendar/menuarrow2.gif +0 -0
- data/public/javascripts/jscalendar/release-notes.html +334 -0
- data/public/javascripts/jscalendar/simple-1.html +244 -0
- data/public/javascripts/jscalendar/simple-2.html +108 -0
- data/public/javascripts/jscalendar/simple-3.html +130 -0
- data/public/javascripts/jscalendar/test-position.html +40 -0
- data/public/javascripts/jscalendar/test.php +116 -0
- data/public/javascripts/toggle_div.js +18 -0
- data/public/stylesheets/niceones.txt +1 -0
- data/public/stylesheets/style.css +8 -1
- data/script/breakpointer +4 -5
- data/script/console +19 -27
- data/script/console_sandbox.rb +7 -0
- data/script/destroy +5 -0
- data/script/generate +3 -68
- data/script/server +6 -16
- data/test/damagecontrol/build_test.rb +8 -8
- data/test/damagecontrol/poller_test.rb +10 -18
- data/test/damagecontrol/project_test.rb +49 -13
- data/test/damagecontrol/publisher/base_test.rb +26 -0
- data/test/damagecontrol/publisher/build/email.rhtml +0 -0
- data/test/damagecontrol/publisher/email_test.rb +26 -0
- data/test/damagecontrol/publisher/fixture.rb +34 -0
- data/test/damagecontrol/publisher/growl_test.rb +15 -0
- data/test/damagecontrol/publisher/jabber_test.rb +15 -0
- data/test/damagecontrol/scm_web_test.rb +1 -1
- data/test/damagecontrol/visitor/changesets.rss +1 -1
- data/test/damagecontrol/visitor/diff_persister_test.rb +4 -4
- data/test/functional/build_controller_test.rb +17 -0
- data/test/test_helper.rb +13 -13
- metadata +185 -24
- data/app/views/project/_bugzilla.rhtml +0 -13
- data/app/views/project/_jira.rhtml +0 -19
- data/app/views/project/_mooky.rhtml +0 -23
- data/app/views/project/_rubyforge.rhtml +0 -19
- data/app/views/project/_scarab.rhtml +0 -19
- data/app/views/project/_scms.rhtml +0 -15
- data/app/views/project/_sourceforge.rhtml +0 -19
- data/app/views/project/_starteam.rhtml +0 -43
- data/app/views/project/_svn.rhtml +0 -22
- data/app/views/project/_trac.rhtml +0 -13
- data/app/views/project/_trackers.rhtml +0 -18
- data/app/views/project/changesets.rhtml +0 -31
|
@@ -19,7 +19,7 @@ module DamageControl
|
|
|
19
19
|
@rss.channel.title = @title
|
|
20
20
|
@rss.channel.link = @link
|
|
21
21
|
@rss.channel.description = @description
|
|
22
|
-
@rss.channel.generator = "
|
|
22
|
+
@rss.channel.generator = "DamageControl"
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def visit_changeset(changeset)
|
|
@@ -37,6 +37,7 @@ module DamageControl
|
|
|
37
37
|
# the last changeset.
|
|
38
38
|
#
|
|
39
39
|
def load_upto(last_changeset_identifier, prior)
|
|
40
|
+
Log.info "Loading #{prior} changesets from #{@changesets_dir} (from #{last_changeset_identifier} and down)"
|
|
40
41
|
last = identifiers.index(last_changeset_identifier)
|
|
41
42
|
|
|
42
43
|
changesets = RSCM::ChangeSets.new
|
|
@@ -45,7 +46,15 @@ module DamageControl
|
|
|
45
46
|
first = 0 if first < 0
|
|
46
47
|
|
|
47
48
|
identifiers[first..last].each do |identifier|
|
|
48
|
-
|
|
49
|
+
changeset_yaml = "#{@changesets_dir}/#{identifier.to_s}/changeset.yaml"
|
|
50
|
+
Log.info "Loading changesets from #{changeset_yaml}"
|
|
51
|
+
begin
|
|
52
|
+
changesets.add(YAML::load_file(changeset_yaml))
|
|
53
|
+
rescue Exception => e
|
|
54
|
+
# Sometimes the yaml files get corrupted
|
|
55
|
+
Log.error "Error loading changesets file: #{File.expand_path(changeset_yaml)}"
|
|
56
|
+
# Todo: delete it and schedule it for re-retrieval somehow.
|
|
57
|
+
end
|
|
49
58
|
end
|
|
50
59
|
end
|
|
51
60
|
changesets
|
data/public/404.html
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
<html>
|
|
2
|
-
<body>
|
|
3
|
-
<h1>File not found</h1>
|
|
4
|
-
<p>Change this error message for pages not found in public/404.html</p>
|
|
5
|
-
</body>
|
|
1
|
+
<html>
|
|
2
|
+
<body>
|
|
3
|
+
<h1>File not found</h1>
|
|
4
|
+
<p>Change this error message for pages not found in public/404.html</p>
|
|
5
|
+
</body>
|
|
6
6
|
</html>
|
data/public/500.html
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
<html>
|
|
2
|
-
<body>
|
|
3
|
-
<h1>Application error (Apache)</h1>
|
|
4
|
-
<p>Change this error message for exceptions thrown outside of an action (like in Dispatcher setups or broken Ruby code) in public/500.html</p>
|
|
5
|
-
</body>
|
|
1
|
+
<html>
|
|
2
|
+
<body>
|
|
3
|
+
<h1>Application error (Apache)</h1>
|
|
4
|
+
<p>Change this error message for exceptions thrown outside of an action (like in Dispatcher setups or broken Ruby code) in public/500.html</p>
|
|
5
|
+
</body>
|
|
6
6
|
</html>
|
data/public/dispatch.cgi
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
#!c:/ruby/bin/ruby
|
|
2
2
|
|
|
3
3
|
require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
|
|
4
4
|
|
|
@@ -6,5 +6,5 @@ require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_
|
|
|
6
6
|
# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
|
|
7
7
|
require "dispatcher"
|
|
8
8
|
|
|
9
|
-
ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) }
|
|
9
|
+
ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
|
|
10
10
|
Dispatcher.dispatch
|
data/public/dispatch.fcgi
CHANGED
data/public/dispatch.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
#!c:/ruby/bin/ruby
|
|
2
2
|
|
|
3
3
|
require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
|
|
4
4
|
|
|
@@ -6,5 +6,5 @@ require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_
|
|
|
6
6
|
# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
|
|
7
7
|
require "dispatcher"
|
|
8
8
|
|
|
9
|
-
ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) }
|
|
9
|
+
ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
|
|
10
10
|
Dispatcher.dispatch
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/public/index.html
CHANGED
|
@@ -1 +1,70 @@
|
|
|
1
|
-
<html
|
|
1
|
+
<html>
|
|
2
|
+
<head>
|
|
3
|
+
<title>Rails: Welcome on board</title>
|
|
4
|
+
<style>
|
|
5
|
+
body { background-color: #fff; color: #333; }
|
|
6
|
+
|
|
7
|
+
body, p, ol, ul, td {
|
|
8
|
+
font-family: verdana, arial, helvetica, sans-serif;
|
|
9
|
+
font-size: 12px;
|
|
10
|
+
line-height: 18px;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
li {
|
|
14
|
+
margin-bottom: 7px;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
pre {
|
|
18
|
+
background-color: #eee;
|
|
19
|
+
padding: 10px;
|
|
20
|
+
font-size: 11px;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
a { color: #000; }
|
|
24
|
+
a:visited { color: #666; }
|
|
25
|
+
a:hover { color: #fff; background-color:#000; }
|
|
26
|
+
</style>
|
|
27
|
+
</head>
|
|
28
|
+
<body>
|
|
29
|
+
|
|
30
|
+
<h1>Congratulations, you've put Ruby on Rails!</h1>
|
|
31
|
+
|
|
32
|
+
<p><b>Before you move on</b>, verify that the following conditions have been met:</p>
|
|
33
|
+
|
|
34
|
+
<ol>
|
|
35
|
+
<li>The log and public directories must be writable to the web server (<code>chmod -R 775 log</code> and <code>chmod -R 775 public</code>).
|
|
36
|
+
<li>
|
|
37
|
+
The shebang line in the public/dispatch* files must reference your Ruby installation. <br/>
|
|
38
|
+
You might need to change it to <code>#!/usr/bin/env ruby</code> or point directly at the installation.
|
|
39
|
+
</li>
|
|
40
|
+
<li>
|
|
41
|
+
Rails on Apache needs to have the cgi handler and mod_rewrite enabled. <br/>
|
|
42
|
+
Somewhere in your httpd.conf, you should have:<br/>
|
|
43
|
+
<code>AddHandler cgi-script .cgi</code><br/>
|
|
44
|
+
<code>LoadModule rewrite_module libexec/httpd/mod_rewrite.so</code><br/>
|
|
45
|
+
<code>AddModule mod_rewrite.c</code>
|
|
46
|
+
</li>
|
|
47
|
+
</ol>
|
|
48
|
+
|
|
49
|
+
<p>Take the following steps to get started:</p>
|
|
50
|
+
|
|
51
|
+
<ol>
|
|
52
|
+
<li>Create empty development and test databases for your application.<br/>
|
|
53
|
+
<small>Recommendation: Use *_development and *_test names, such as basecamp_development and basecamp_test</small><br/>
|
|
54
|
+
<small>Warning: Don't point your test database at your development database, it'll destroy the latter on test runs!</small>
|
|
55
|
+
<li>Edit config/database.yml with your database settings.
|
|
56
|
+
<li>Create controllers and models using the generator in <code>script/generate</code> <br/>
|
|
57
|
+
<small>Help: Run the generator with no arguments for documentation</small>
|
|
58
|
+
<li>See all the tests run by running <code>rake</code>.
|
|
59
|
+
<li>Develop your Rails application!
|
|
60
|
+
<li>Setup Apache with <a href="http://www.fastcgi.com">FastCGI</a> (and <a href="http://raa.ruby-lang.org/list.rhtml?name=fcgi">Ruby bindings</a>), if you need better performance
|
|
61
|
+
</ol>
|
|
62
|
+
|
|
63
|
+
<p>
|
|
64
|
+
Having problems getting up and running? First try debugging it yourself by looking at the log files. <br/>
|
|
65
|
+
Then try the friendly Rails community <a href="http://www.rubyonrails.org">on the web</a> or <a href="http://www.rubyonrails.org/show/IRC">on IRC</a>
|
|
66
|
+
(<a href="irc://irc.freenode.net/#rubyonrails">FreeNode#rubyonrails</a>).
|
|
67
|
+
</p>
|
|
68
|
+
|
|
69
|
+
</body>
|
|
70
|
+
</html>
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/*
|
|
2
|
+
http://www.shoestringcms.com/personal/codelib/JavaScript/DemoDate.html
|
|
3
|
+
|
|
4
|
+
dateFormat.js - Format a date to a user-defined string formats.
|
|
5
|
+
Written by John Brooking, March 2001
|
|
6
|
+
See DemoDate.htm for a demo of use.
|
|
7
|
+
|
|
8
|
+
This program is released into the public domain. You are prohibited
|
|
9
|
+
from selling it, and please include the existing revision history
|
|
10
|
+
with any modifications you make, plus add your own. You are
|
|
11
|
+
encouraged to share any modifications with me and others, and to
|
|
12
|
+
report problems to me, at http://www.pobox.com/~JohnBrook.
|
|
13
|
+
|
|
14
|
+
$Log3: F:\QVCS\Code Library\JavaScript\dateFormat.kt $
|
|
15
|
+
|
|
16
|
+
A JavaScript routine to format dates to a variety of strings.
|
|
17
|
+
|
|
18
|
+
Revision 1.4 by: John Brooking Rev date: Thu Oct 03 08:18:00 2002
|
|
19
|
+
Fixed bug in ordinals: All teens should get "th", not standard
|
|
20
|
+
rules. (This was not really checked into QVCS, because my
|
|
21
|
+
personal library is not functional currently. I'm just faking
|
|
22
|
+
this entry.)
|
|
23
|
+
|
|
24
|
+
Revision 1.3 by: John Brooking Rev date: Fri Aug 31 16:40:00 2001
|
|
25
|
+
Fixed bug in "quarter" equations.
|
|
26
|
+
|
|
27
|
+
Revision 1.2 by: John Brooking Rev date: Sat Apr 21 07:55:24 2001
|
|
28
|
+
Fixed bug in %h% and %hh% formats (show hour as number 1-12) due to
|
|
29
|
+
JavaScript handling of negative numbers. Midnight was being printed as
|
|
30
|
+
"0" rather than "12". Thanks to Michael Ennis for reporting this.
|
|
31
|
+
|
|
32
|
+
Revision 1.1 by: John Brooking Rev date: Thu Mar 15 22:55:24 2001
|
|
33
|
+
Added new formats %dth% and %ddth%, and added more verbosity about
|
|
34
|
+
public domain use at the top.
|
|
35
|
+
|
|
36
|
+
$Endlog$
|
|
37
|
+
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
Date.prototype.format = function(fmt) {
|
|
42
|
+
return dateFormat(fmt, this);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
ESCAPE_CHR = "%";
|
|
47
|
+
ERR_UNCLOSED = "Error: Format string not terminated!";
|
|
48
|
+
ERR_UNKNOWN = "Error: Unknown format string!";
|
|
49
|
+
|
|
50
|
+
function isLeapYear(y)
|
|
51
|
+
{
|
|
52
|
+
return (( y % 100 == 0 ) ? (y % 400 == 0) : (y % 4 == 0));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function dayOfYear(theDate)
|
|
56
|
+
{
|
|
57
|
+
var monthlens = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
|
|
58
|
+
var yearDay = 0
|
|
59
|
+
|
|
60
|
+
// Total days in months prior to this one
|
|
61
|
+
for( var mon = 0; mon < theDate.getMonth(); ++mon )
|
|
62
|
+
yearDay += monthlens[mon];
|
|
63
|
+
|
|
64
|
+
// Add one if March or later of a leap year
|
|
65
|
+
if( isLeapYear(theDate.getFullYear()) && theDate.getMonth() >= 2 )
|
|
66
|
+
++yearDay;
|
|
67
|
+
|
|
68
|
+
// Add days of current month
|
|
69
|
+
yearDay += theDate.getDate();
|
|
70
|
+
|
|
71
|
+
return yearDay;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function padnum2(n)
|
|
75
|
+
{
|
|
76
|
+
return (n < 10) ? "0" + n : "" + n;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function dateFormat(fmt, theDate)
|
|
80
|
+
{
|
|
81
|
+
var fmtIndex = 0, fmtLen = fmt.length;
|
|
82
|
+
var c, thisFmt, mon, yearDay;
|
|
83
|
+
var weekdays = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" );
|
|
84
|
+
var monthnames = new Array("January", "February", "March", "April",
|
|
85
|
+
"May", "June", "July", "August", "September",
|
|
86
|
+
"October", "November", "December");
|
|
87
|
+
var result = "";
|
|
88
|
+
|
|
89
|
+
// If date parameter passed not an object, return blank.
|
|
90
|
+
if( typeof(theDate) != "object" )
|
|
91
|
+
return "";
|
|
92
|
+
// This is almost the extent of our real sophisticated error checking!
|
|
93
|
+
|
|
94
|
+
// Loop over each character in format string
|
|
95
|
+
while( fmtIndex < fmtLen )
|
|
96
|
+
{
|
|
97
|
+
c = fmt.substr( fmtIndex, 1);
|
|
98
|
+
|
|
99
|
+
// If it is a leading escape character,
|
|
100
|
+
if( c == ESCAPE_CHR )
|
|
101
|
+
{
|
|
102
|
+
thisFmt = "";
|
|
103
|
+
if( ++fmtIndex == fmtLen )
|
|
104
|
+
return ERR_UNCLOSED;
|
|
105
|
+
|
|
106
|
+
// Build up the format string
|
|
107
|
+
while(( c = fmt.substr( fmtIndex, 1)) != ESCAPE_CHR )
|
|
108
|
+
{
|
|
109
|
+
thisFmt += c;
|
|
110
|
+
if( ++fmtIndex == fmtLen )
|
|
111
|
+
return ERR_UNCLOSED;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Now just take the specified action!
|
|
115
|
+
// (Yes, a switch statement would be more appropriate here, but
|
|
116
|
+
// since that is a later addition to JS, I'm avoiding it here to
|
|
117
|
+
// be as compatible as possible.)
|
|
118
|
+
|
|
119
|
+
if( thisFmt == "d" ) // Day of month w/o leading 0
|
|
120
|
+
result += theDate.getDate();
|
|
121
|
+
|
|
122
|
+
else if (thisFmt == "dd" ) // Day of month with leading 0
|
|
123
|
+
result += padnum2(theDate.getDate());
|
|
124
|
+
|
|
125
|
+
else if (thisFmt == "ddd" ) // Day of week abbreviated
|
|
126
|
+
result += weekdays[theDate.getDay()].substr(0,3);
|
|
127
|
+
|
|
128
|
+
else if (thisFmt == "dddd" ) // Day of week full
|
|
129
|
+
result += weekdays[theDate.getDay()];
|
|
130
|
+
|
|
131
|
+
else if (thisFmt == "dth" ) // Day of month as ordinal w/o leading 0
|
|
132
|
+
{
|
|
133
|
+
var d = theDate.getDate();
|
|
134
|
+
result += d;
|
|
135
|
+
if( d > 10 && d < 20 ) { // teens all get "th"
|
|
136
|
+
result += "th";
|
|
137
|
+
}
|
|
138
|
+
else { // else, normal rules apply
|
|
139
|
+
switch (d % 10) {
|
|
140
|
+
case 1: result += "st"; break;
|
|
141
|
+
case 2: result += "nd"; break;
|
|
142
|
+
case 3: result += "rd"; break;
|
|
143
|
+
default: result += "th"; break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/*
|
|
147
|
+
if(( d % 10) == 1 )
|
|
148
|
+
result += "st";
|
|
149
|
+
else if(( d % 10) == 2 )
|
|
150
|
+
result += "nd";
|
|
151
|
+
else if(( d % 10) == 3 )
|
|
152
|
+
result += "rd";
|
|
153
|
+
else
|
|
154
|
+
result += "th";
|
|
155
|
+
*/
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
else if (thisFmt == "ddth" ) // Day of month as ordinal with leading 0
|
|
159
|
+
{
|
|
160
|
+
var d = theDate.getDate();
|
|
161
|
+
result += padnum2(d);
|
|
162
|
+
if( d > 10 && d < 20 ) { // teens all get "th"
|
|
163
|
+
result += "th";
|
|
164
|
+
}
|
|
165
|
+
else { // else, normal rules apply
|
|
166
|
+
switch (d % 10) {
|
|
167
|
+
case 1: result += "st"; break;
|
|
168
|
+
case 2: result += "nd"; break;
|
|
169
|
+
case 3: result += "rd"; break;
|
|
170
|
+
default: result += "th"; break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/*
|
|
174
|
+
if(( d % 10) == 1 )
|
|
175
|
+
result += "st";
|
|
176
|
+
else if(( d % 10) == 2 )
|
|
177
|
+
result += "nd";
|
|
178
|
+
else if(( d % 10) == 3 )
|
|
179
|
+
result += "rd";
|
|
180
|
+
else
|
|
181
|
+
result += "th";
|
|
182
|
+
*/
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
else if( thisFmt == "w" ) // Day of week as a number (0=Sun)
|
|
186
|
+
result += theDate.getDay();
|
|
187
|
+
|
|
188
|
+
else if( thisFmt == "ww" ) // Week of the year
|
|
189
|
+
result += parseInt(dayOfYear(theDate)/7, 10) + 1;
|
|
190
|
+
|
|
191
|
+
else if( thisFmt == "m" ) // Month number w/o leading 0
|
|
192
|
+
result += theDate.getMonth() + 1;
|
|
193
|
+
|
|
194
|
+
else if (thisFmt == "mm" ) // Month number with leading 0
|
|
195
|
+
result += padnum2(theDate.getMonth() + 1);
|
|
196
|
+
|
|
197
|
+
else if (thisFmt == "mmm" ) // Month name abbreviated
|
|
198
|
+
result += monthnames[theDate.getMonth()].substr(0,3);
|
|
199
|
+
|
|
200
|
+
else if (thisFmt == "mmmm" ) // Month name full
|
|
201
|
+
result += monthnames[theDate.getMonth()];
|
|
202
|
+
|
|
203
|
+
else if (thisFmt == "q" ) // Quarter of year as number
|
|
204
|
+
result += parseInt(theDate.getMonth()/3) + 1;
|
|
205
|
+
|
|
206
|
+
else if (thisFmt == "qq" ) // Quarter of year as ordinal
|
|
207
|
+
{
|
|
208
|
+
var q = parseInt(theDate.getMonth()/3);
|
|
209
|
+
if( q == 0 )
|
|
210
|
+
result += "1st";
|
|
211
|
+
else if( q == 1 )
|
|
212
|
+
result += "2nd";
|
|
213
|
+
else if( q == 2 )
|
|
214
|
+
result += "3rd";
|
|
215
|
+
else if( q == 3 )
|
|
216
|
+
result += "4th";
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
else if( thisFmt == "y" ) // Day of the year as number
|
|
220
|
+
result += dayOfYear(theDate);
|
|
221
|
+
|
|
222
|
+
else if( thisFmt == "yy" ) // Year as two digits
|
|
223
|
+
result += ("" + theDate.getFullYear()).substr(2,2);
|
|
224
|
+
|
|
225
|
+
else if( thisFmt == "yyyy" ) // Year as four digits
|
|
226
|
+
result += theDate.getFullYear();
|
|
227
|
+
|
|
228
|
+
else if( thisFmt == "h" ) // Hour (1-12) w/o leading 0
|
|
229
|
+
result += ((theDate.getHours() + 12 - 1) % 12) + 1;
|
|
230
|
+
|
|
231
|
+
else if (thisFmt == "hh" ) // Hour (1-12) with leading 0
|
|
232
|
+
result += padnum2(((theDate.getHours() + 12 - 1) % 12) + 1);
|
|
233
|
+
|
|
234
|
+
else if( thisFmt == "h24" ) // Hour (0-23) w/o leading 0
|
|
235
|
+
result += theDate.getHours();
|
|
236
|
+
|
|
237
|
+
else if (thisFmt == "hh24" ) // Hour (0-23) with leading 0
|
|
238
|
+
result += padnum2(theDate.getHours());
|
|
239
|
+
|
|
240
|
+
else if( thisFmt == "n" ) // Minute w/o leading 0
|
|
241
|
+
result += theDate.getMinutes();
|
|
242
|
+
|
|
243
|
+
else if (thisFmt == "nn" ) // Minute with leading 0
|
|
244
|
+
result += padnum2(theDate.getMinutes());
|
|
245
|
+
|
|
246
|
+
else if( thisFmt == "s" ) // Seconds w/o leading 0
|
|
247
|
+
result += theDate.getSeconds();
|
|
248
|
+
|
|
249
|
+
else if ( thisFmt == "ss" ) // Seconds with leading 0
|
|
250
|
+
result += padnum2(theDate.getSeconds());
|
|
251
|
+
|
|
252
|
+
else if ( thisFmt == "AM/PM" ) // AM/PM capitalized
|
|
253
|
+
result += theDate.getHours() < 12 ? "AM" : "PM";
|
|
254
|
+
|
|
255
|
+
else if ( thisFmt == "am/pm" ) // am/pm lowercase
|
|
256
|
+
result += theDate.getHours() < 12 ? "am" : "pm";
|
|
257
|
+
|
|
258
|
+
else if ( thisFmt == "A/P" ) // A/P capitalized
|
|
259
|
+
result += theDate.getHours() < 12 ? "A" : "P";
|
|
260
|
+
|
|
261
|
+
else if ( thisFmt == "a/p" ) // a/p lowercase
|
|
262
|
+
result += theDate.getHours() < 12 ? "a" : "p";
|
|
263
|
+
|
|
264
|
+
else if ( thisFmt == "tz") // Timezone as hours behind Greenwich
|
|
265
|
+
result += theDate.getTimezoneOffset();
|
|
266
|
+
|
|
267
|
+
else if ( thisFmt == "tzn") // Timezone as name
|
|
268
|
+
{
|
|
269
|
+
mon = "" + theDate;
|
|
270
|
+
result += mon.substr(20, mon.length - 25);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
else
|
|
274
|
+
return ERR_UNKNOWN;
|
|
275
|
+
}
|
|
276
|
+
else
|
|
277
|
+
result += c;
|
|
278
|
+
|
|
279
|
+
++fmtIndex;
|
|
280
|
+
} // while
|
|
281
|
+
|
|
282
|
+
return result;
|
|
283
|
+
}
|