diff --git a/config/database.yml.dist b/config/database.yml.dist new file mode 100755 index 0000000..025d62a --- /dev/null +++ b/config/database.yml.dist @@ -0,0 +1,22 @@ +# SQLite version 3.x +# gem install sqlite3-ruby (not necessary on OS X Leopard) +development: + adapter: sqlite3 + database: db/development.sqlite3 + pool: 5 + timeout: 5000 + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + adapter: sqlite3 + database: db/test.sqlite3 + pool: 5 + timeout: 5000 + +production: + adapter: sqlite3 + database: db/production.sqlite3 + pool: 5 + timeout: 5000 diff --git a/timcharper-calendar_date_select-d3b2b8c/.gitignore b/timcharper-calendar_date_select-d3b2b8c/.gitignore deleted file mode 100755 index 15cb453..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/pkg -/doc -*.gem \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/History.txt b/timcharper-calendar_date_select-d3b2b8c/History.txt deleted file mode 100755 index 08b3598..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/History.txt +++ /dev/null @@ -1,270 +0,0 @@ -== Version 1.16.1 - -* 1.16 was a lemon release. Sorry! Deploy script had an error and messed up the code on the way out. - -== Version 1.16 - -* Ability to specify a default time/date if no time/date is selected in the target form element. (Shih-gian Lee) - -== Version 1.15.2 - -* Fix for set date (day must go last) (ujifgc) -* added logic to wrap image in span tag when there is error fields. (Shih-gian Lee) -* Initial commit of default time implementation. (Shih-gian Lee) -* default time implementation in form_helpers.rb. (Shih-gian Lee) -* Fix calendar_date_select helper for searchlogic compatibility (Andrea Frigido) -* Added Arabic language translations (Abdul-Jabbar Shalabi) -* rename instance variable. avoid conflict with name (Cyril Mougel) -* add translation in french (Cyril Mougel) -* Adding Slovenian sl-sl locale. (Miha Rebernik) -* Added danish format (Jacob Kjeldahl) -* translations for NL (Gert van der Spoel) -* new color scheme 'green' (Gert van der Spoel) -* Fixed missing translation in polish locales (Witold Rugowski) -* Added a italian locale (Andrea Frigido) -* fix time handling (Robert Brown) -* Added a spanish locale on public/javascripts/calendar_date_select/locale/es.js (kikito) -* Added description for iso date format (Lars E. Hoeg) -* Added Danish (da) translation (Lars E. Hoeg) -* Fixes issue with nil dates and trying to call type on them (Matt Haley) - -== Version 1.15.1 - * Bugfix: iso_date fixes (Robert Brown) - -== Version 1.15 - * Bugfix: don't include the :image option in the input field - -== Version 1.14 - * Added support for Rails 2.3 - -== Version 1.13 - * Lots of code clean up! - * Moved test suite over to rspec - * CalendarDateSelect.default_options implemented. Use CalendarDateSelect.default_options.update(...) to set the default_options for your app. - * calendar_date_select and calendar_date_select_tag accept an :image parameter. - * Backwards compatibility hook for Rails 2.1 - * RDOC! - * Don't try to focus a hidden or disabled element (closes #129 - thanks Bruno) - * Call onchange callback when clearing the calendar (closes #137 - thanks Chewi) - * Fixed issue that made :db format worthless (closes #135, thanks Andreas Zecher) - * dramatic optimization for calendar initial-rendering (thanks Yehudab, Bompus) - -== Version 1.12 == - * Updated for compatibility with Rails 2.2 - -== Version 1.11.1 == - * properly wrap buttons if they are too big for the line - * more translations: german (Jonas), Added russian translation (DEkart) - * locale fixes: - * Fix: time doesn't work (using 12 hour instead of 24 hour) in Italian format. - * updated Portuguese translation with the "Clear" action (Daniel Luz) - * Portuguese was missing month of October - * Added a clear button (Hendy Tanata) - * Reverted a change that attempted to fix position in a scrollable div, but caused probles elsewhere - * Added :minute_interval to calendar_date_select_process_options, fixing http://code.google.com/p/calendardateselect/issues/detail?id=81 - * Add helpers to give the list of javascripts and stylesheets (calendar_date_select_javascripts and calendar_date_select_stylesheets) - * Converted over to use Hoe (echoe was giving too many problems). Refactored the directory structure to make it more gem-ish. - -== Version 1.11 == - - * Calendar Date Select now works as a ruby-gem (thanks, artmotion!) - * Applied fix outlined in Issue #83: http://code.google.com/p/calendardateselect/issues/detail?id=83 (Thanks David Bolton) - -== Version 1.10.5 == -Apr 7, 2008 - * Javascript code refactoring! Less mess! - * Bugfix - range was including element 42, which is really the 43rd element, so there was an error happening when today happens exactly 43 days after the beginning date (caught this by chance, surprised it wasn't reported before) - -== Version 1.10.4 == -Mar 24, 2008 - * patch applied to fix issue #92: nil object option causes CalendarDateSelect.calendar_date_select(object, method, options) to not use object. Thanks, sskirby! - -== Version 1.10.3 == -Mar 24. 2008 - * Fixed active scaffold integration bug. Thanks tapajos! - -== Version 1.10.2 == -Mar 10. 2008 - * bugfix: calendar_date_select_tag doesn't format Time and Date values (thanks for the patch, sskirby!) - -== Version 1.10.1 == -Mar 10, 2008 - * updated to automatically install locale folder - * bugfix - cds "today" was showing up as Mar 9th 2008, when it was really Mar 10th 2008 - was caused by a wrinkle in time (Day light savings time) - * Prototype 1.6.0.1 compatibility issue (77) resolved - thanks mike.nicholaides for the patch! - * patch applied from mjroghelia to fix ie ssl iframe issue (84) - * xhtml error fixed -   replaced with #160; - -==Version 1.10 == -Dec 3, 2007 - * You can now pass in a parameter to tell CalendarDateSelect not to allow selection of certain dates. See the [http://www.restatesman.com/static/calendar?tab=other demo] for an example. - -==Version 1.9.2== -Nov 26, 2007 - * CalendarDateSelect was leaking javascript variables. (nothing was explicitly declared local, so javascript assumes global). Added test case and applied fix. This may help with some of the conflicts CalendarDateSelect has been causing with other scripts. - * Applied Ryan Wood's patch to fix the problem with using a form builder against objects like authorization[coverage_attributes][]. Thanks Ryan Wood! - * Wes Hays brought up the point of parseInt trying to auto-detect number formats. Wrote code to force interpretation of digits as base10, with test cases to prove it. - * Misleading test case failure in Safari fixed: Safari won't let a boolean value to a property that should have a function (understandably). Changed the test variable names to prevent such a conflict. - * Now uses css :hover, rather than manually setting/removing the hover class. If you are using a custom stylesheet, you'll need to change ".calendar_date_select tbody td.hover" to ".calendar_date_select tbody td:hover" (thanks, Alex Egg) - -==Version 1.9.1== -Nov 15, 2007 - * Removed dependency on deprecated features in 1.6.0. Thanks again, Richard Quadling! - * Bugfix - was showing wrong day selected when selecting Mar 23, 2008. (Day light savings time issue). Fixed with test case. - * Added CSS style to show red border around the embedded calendar_date_select div's with errors. - * Callbacks were broken with 1.9.0. Fixed, added test cases. - -==Version 1.9.0== -Nov 13, 2007 - * Prototype 1.6.0 compatibility update. Will now break with earlier versions of prototype (ie 1.5.1). Big thanks to Kevin Alexander and Richard Quadling - * Additional test coverage for improved stability going forward. - -==Version 1.8.3== -Nov 12, 2007 - - * Improved close methods: - * Added "OK" button at the bottom - * Double clicking a day closes the calendar (not in IE, though... because IE is everyone's favorite browser to program for) - * Escape key closes calendar - * Added optional close button at the top, which is hidden by default. Don't use this unless you really need it, because it may disappear in the future. - * Don't focus a hidden element - * Navigate down to child input element if exists (in case a div tag is passed in). Resolves problems when input control is wrapped with a error div. Test cases - * Allow specific year ranges (pass in an array) - * restrict year navigation inside of a non-flexible range - * test case to check auto-repopulating of flexibleYearRanges. - * test case to check boundaries of nonFlexibleYearRanges. - * Ability to pass in :year_range => 5.years.ago..0.years.ago to calendar_date_select (ruby) - * Updated test cases - * Bugfix for duplicate days that were occuring across day-light-saving-time boundaries - * Added format_american.js (thanks, Wes Hays) - * Added format_italian.js (thanks, Bigonazzi) - * Added format_euro_24hr.js (thanks, James Silberbauer) - * Bugfix for Konqueror - Was showing blank white box for popup window - had to do with Iframe hack. - * Code-refactoring, clean up, breaking down methods, making the code easier to understand and extend. - * Added new stylesheet definition: .calendar_date_select .cds_header a.close { display: none}. Update your custom stylesheet with this new definition. - - -==Version 1.8.1== -September 27 2007 - * 1.8.0 was rushed. There were a bunch of bugs that cropped up immediately. This deploy includes JavaScript unit testing using the scriptaculous unit test framework! ([http://www.restatesman.com/calendar_date_select/js_test/functional/cds_test.html click here to run the tests on the latest trunk version]). These unit tests are going to greatly improve the reliability of CalendarDateSelect releases. - -==Version 1.8.0== - -September 26 2007 - * Bugfix - Safari 2 issue fixed (was interpreting "" as January 1, 1969) - * CSS overhaul - removed buttons and replaced with links. Cleaned up CSS. See CSSDiff_1_7_0__1_8_0 for a diff. - * :popup => :force (force the user to select a date) - * :time => "mixed" - You can now create a calendar control that allows a user to select "all day" or a specific time! - * :month_year => "label" - Replace the clunky dropdowns with a text. - * Some internal "gardening" on the code - -==Version 1.7.1== - -Aug 29 2007 - - * Rendering options weren't being passed to the input control (like :style, :class, etc.) - -==Version 1.7.0== - -Aug 24 2007 - - * update calendar date select to not rely on dom_id's anymore ( and no longer automatically changes the dom_id for your input fields ) - - * applied Steve Madsen's patch for not blanking out invalid dates. - -==Version 1.6.1== - -Aug 24 2007 - - * Serious javascript bug when using "hyphen_ampm" format fixed. (Was only working in Firefox browsers with firebug installed) - - * Added a bunch of new callbacks: before_show, before_close, after_show, after_close, after_navigate. (see [http://www.restatesman.com/static/calendar?tab=callbacks here] for details) - - -==Version 1.6.0== - -July 27 2007 - - * Now MUCH easier to change date formats! See ChangingDateFormat for details. - * Opera button labels fixed - * Calendar "flicker" fixed when displaying popup window. - * JS error 106 being thrown - fixed - * Bug fixes relating to calendar date select deciding whether to display above or below an element on a page - * XHTML compliance issue resolved - image had an invalid "id" - * Disabled/readonly elements can't be updated - * (note, if you wish to prevent user from inputting a date without the date picker, use the "embedded" option. See [http://restatesman.com/static/calendar/ demo] for example). - * Changes/cleanups submitted by Steve Madsen. If you see Steve, tell him what a great guy he is! - * Ability to change calendar image via CalendarDateSelect.image= - * cleaning up on how input tags are rendered - -==Version 1.5.2== - -July 12 2007 - * onchange event handler now supported. - * detects to see if prototype is loaded. If not, shows error message - * ability to hide "buttons" - * date parsing broken out to static function Date.parseFormattedString() for anyone who wants date's to parse a different way from javascript - * you can no longer select 1:60 pm. - -==Version 1.5.1== - -June 21, 2007 - - * fixed following tickets: - * Selecting dates in April 2007 doesn't highlight day - * Selecting 29 February 2008 returns 1 March 2008 - * options[:format] needs to be purged - -==Version 1.5== -June 18, 2007 - - * New CSS stylesheet - - * Fixed "white on white" css issue when selecting a day - - * Clicking today now updates the input field - -==Version 1.4== -June 16, 2007 - - * more bug fixes (selecting across daylight savings time causing js error. Sometimes clicking a day of the next month after selecting day 31 of the previous month was causing 2 months later to be selected) - - * CSS improvements and refactoring - - * form builder methods now automatically detect whether or not to use a Time field - - * a bit more optimization - - * refactored date formatter methods and others so they can be more easily overridden. - -==Version 1.3== -June 8, 2007 - - * a few bug fixes - - * Modified the helper methods to allow passing of virtually any JavaScript argument into the JavaScript control. - -==Version 1.2== -June 4, 2007 - - * Big optimizations to the redrawing of the calendar. Now, previous/next buttons much more responsive. - - * Improved feel of pop-up dialog - when somewhere else clicked on the screen other than the popup calendar, popup calendar will automatically close. - - * If the popup window won't fit on the screen underneath the control, will automatically position to the top. - - -==Version 1.1== -June 2, 2007 - - * There was a very strange bug that crept in for Internet Explorer. Internet Explorer does not allow you to set the innerHTML property for "button" elements. Therefore, it was necessary to change "button" elements to "input" elements of type button. - - * There was a change to the CSS file. Anything applying styles to "button" elements has been changed to "input.button". If you have a custom stylesheet, update accordingly. - -==Version 1.0== -June 1, 2007 - - * Initial release! - - - diff --git a/timcharper-calendar_date_select-d3b2b8c/MIT-LICENSE b/timcharper-calendar_date_select-d3b2b8c/MIT-LICENSE deleted file mode 100755 index d4f8dbd..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/MIT-LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -All portions Copyright (c) 2007 Tim Harper - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/timcharper-calendar_date_select-d3b2b8c/Manifest.txt b/timcharper-calendar_date_select-d3b2b8c/Manifest.txt deleted file mode 100755 index 0f02e27..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/Manifest.txt +++ /dev/null @@ -1,42 +0,0 @@ -History.txt -init.rb -js_test/functional/cds_test.html -js_test/prototype.js -js_test/test.css -js_test/unit/cds_helper_methods.html -js_test/unittest.js -lib/calendar_date_select/calendar_date_select.rb -lib/calendar_date_select/includes_helper.rb -lib/calendar_date_select/form_helpers.rb -lib/calendar_date_select.rb -Manifest.txt -MIT-LICENSE -public/blank_iframe.html -public/images/calendar_date_select/calendar.gif -public/javascripts/calendar_date_select/calendar_date_select.js -public/javascripts/calendar_date_select/format_american.js -public/javascripts/calendar_date_select/format_db.js -public/javascripts/calendar_date_select/format_euro_24hr.js -public/javascripts/calendar_date_select/format_euro_24hr_ymd.js -public/javascripts/calendar_date_select/format_finnish.js -public/javascripts/calendar_date_select/format_hyphen_ampm.js -public/javascripts/calendar_date_select/format_iso_date.js -public/javascripts/calendar_date_select/format_italian.js -public/javascripts/calendar_date_select/locale/de.js -public/javascripts/calendar_date_select/locale/fi.js -public/javascripts/calendar_date_select/locale/fr.js -public/javascripts/calendar_date_select/locale/pl.js -public/javascripts/calendar_date_select/locale/pt.js -public/javascripts/calendar_date_select/locale/ru.js -public/stylesheets/calendar_date_select/blue.css -public/stylesheets/calendar_date_select/default.css -public/stylesheets/calendar_date_select/plain.css -public/stylesheets/calendar_date_select/red.css -public/stylesheets/calendar_date_select/silver.css -Rakefile -README.txt -spec/ -spec/calendar_date_select -spec/calendar_date_select/calendar_date_select_spec.rb -spec/calendar_date_select/form_helpers_spec.rb -spec/spec_helper.rb diff --git a/timcharper-calendar_date_select-d3b2b8c/README.txt b/timcharper-calendar_date_select-d3b2b8c/README.txt deleted file mode 100755 index d96bc31..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/README.txt +++ /dev/null @@ -1,18 +0,0 @@ -= CalendarDateSelect - -http://code.google.com/p/calendardateselect/ - -This project is looking for a new maintainer. Please contact me if you have sufficient interest in this project to move it forward. - -== Examples - -"See a demo here":http://electronicholas.com/calendar - -== Submitting patches - -Please take care to do the following: - -* Clean up your patch (don't send a patch bomb with a hundred features in one) -* Write test cases! -* As a general rule of thumb, think of ways to make things more general purpose than specific. - diff --git a/timcharper-calendar_date_select-d3b2b8c/Rakefile b/timcharper-calendar_date_select-d3b2b8c/Rakefile deleted file mode 100755 index 06f4ac3..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/Rakefile +++ /dev/null @@ -1,36 +0,0 @@ -# -*- ruby -*- - - -begin - require 'jeweler' - Jeweler::Tasks.new do |gemspec| - gemspec.name = "calendar_date_select" - gemspec.version = File.read("VERSION").strip - gemspec.summary = "Calendar date picker for rails" - gemspec.description = "Calendar date picker for rails" - gemspec.email = "" - gemspec.homepage = "http://github.com/timcharper/calendar_date_select" - gemspec.authors = ["Shih-gian Lee", "Enrique Garcia Cota (kikito)", "Tim Charper", "Lars E. Hoeg"] - end -rescue LoadError - puts "Jeweler not available. Install it with: sudo gem install jeweler" -end - -desc "Set the current gem version in the code according to the VERSION file" -task :set_version do - VERSION=File.read("VERSION").strip - ["lib/calendar_date_select/calendar_date_select.rb", "public/javascripts/calendar_date_select/calendar_date_select.js"].each do |file| - abs_file = File.dirname(__FILE__) + "/" + file - src = File.read(abs_file) - src = src.map do |line| - case line - when /^ *VERSION/ then " VERSION = '#{VERSION}'\n" - when /^\/\/ CalendarDateSelect version / then "// CalendarDateSelect version #{VERSION} - a prototype based date picker\n" - else - line - end - end.join - File.open(abs_file, "wb") { |f| f << src } - end -end -# vim: syntax=Ruby diff --git a/timcharper-calendar_date_select-d3b2b8c/VERSION b/timcharper-calendar_date_select-d3b2b8c/VERSION deleted file mode 100755 index 41c11ff..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.16.1 diff --git a/timcharper-calendar_date_select-d3b2b8c/calendar_date_select.gemspec b/timcharper-calendar_date_select-d3b2b8c/calendar_date_select.gemspec deleted file mode 100755 index fc0912a..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/calendar_date_select.gemspec +++ /dev/null @@ -1,95 +0,0 @@ -# Generated by jeweler -# DO NOT EDIT THIS FILE DIRECTLY -# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command -# -*- encoding: utf-8 -*- - -Gem::Specification.new do |s| - s.name = %q{calendar_date_select} - s.version = "1.16.1" - - s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= - s.authors = ["Shih-gian Lee", "Enrique Garcia Cota (kikito)", "Tim Charper", "Lars E. Hoeg"] - s.date = %q{2010-03-29} - s.description = %q{Calendar date picker for rails} - s.email = %q{} - s.extra_rdoc_files = [ - "README.txt" - ] - s.files = [ - ".gitignore", - "History.txt", - "MIT-LICENSE", - "Manifest.txt", - "README.txt", - "Rakefile", - "VERSION", - "calendar_date_select.gemspec", - "init.rb", - "js_test/functional/.tmp_cds_test.html", - "js_test/functional/cds_test.html", - "js_test/functional/format_iso_date_test.html", - "js_test/prototype.js", - "js_test/test.css", - "js_test/unit/cds_helper_methods.html", - "js_test/unittest.js", - "lib/calendar_date_select.rb", - "lib/calendar_date_select/calendar_date_select.rb", - "lib/calendar_date_select/form_helpers.rb", - "lib/calendar_date_select/includes_helper.rb", - "public/blank_iframe.html", - "public/images/calendar_date_select/calendar.gif", - "public/javascripts/calendar_date_select/calendar_date_select.js", - "public/javascripts/calendar_date_select/format_american.js", - "public/javascripts/calendar_date_select/format_danish.js", - "public/javascripts/calendar_date_select/format_db.js", - "public/javascripts/calendar_date_select/format_euro_24hr.js", - "public/javascripts/calendar_date_select/format_euro_24hr_ymd.js", - "public/javascripts/calendar_date_select/format_finnish.js", - "public/javascripts/calendar_date_select/format_hyphen_ampm.js", - "public/javascripts/calendar_date_select/format_iso_date.js", - "public/javascripts/calendar_date_select/format_italian.js", - "public/javascripts/calendar_date_select/locale/ar.js", - "public/javascripts/calendar_date_select/locale/da.js", - "public/javascripts/calendar_date_select/locale/de.js", - "public/javascripts/calendar_date_select/locale/es.js", - "public/javascripts/calendar_date_select/locale/fi.js", - "public/javascripts/calendar_date_select/locale/fr.js", - "public/javascripts/calendar_date_select/locale/it.js", - "public/javascripts/calendar_date_select/locale/nl.js", - "public/javascripts/calendar_date_select/locale/pl.js", - "public/javascripts/calendar_date_select/locale/pt.js", - "public/javascripts/calendar_date_select/locale/ru.js", - "public/javascripts/calendar_date_select/locale/sl.js", - "public/stylesheets/calendar_date_select/blue.css", - "public/stylesheets/calendar_date_select/default.css", - "public/stylesheets/calendar_date_select/green.css", - "public/stylesheets/calendar_date_select/plain.css", - "public/stylesheets/calendar_date_select/red.css", - "public/stylesheets/calendar_date_select/silver.css", - "spec/calendar_date_select/calendar_date_select_spec.rb", - "spec/calendar_date_select/form_helpers_spec.rb", - "spec/calendar_date_select/includes_helper_spec.rb", - "spec/spec_helper.rb" - ] - s.homepage = %q{http://github.com/timcharper/calendar_date_select} - s.rdoc_options = ["--charset=UTF-8"] - s.require_paths = ["lib"] - s.rubygems_version = %q{1.3.6} - s.summary = %q{Calendar date picker for rails} - s.test_files = [ - "spec/calendar_date_select/calendar_date_select_spec.rb", - "spec/calendar_date_select/form_helpers_spec.rb", - "spec/calendar_date_select/includes_helper_spec.rb", - "spec/spec_helper.rb" - ] - - if s.respond_to? :specification_version then - current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION - s.specification_version = 3 - - if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then - else - end - else - end -end diff --git a/timcharper-calendar_date_select-d3b2b8c/init.rb b/timcharper-calendar_date_select-d3b2b8c/init.rb deleted file mode 100755 index c6b284e..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/init.rb +++ /dev/null @@ -1 +0,0 @@ -require File.dirname(__FILE__) + "/lib/calendar_date_select.rb" diff --git a/timcharper-calendar_date_select-d3b2b8c/js_test/functional/.tmp_cds_test.html b/timcharper-calendar_date_select-d3b2b8c/js_test/functional/.tmp_cds_test.html deleted file mode 100755 index 8c13a5c..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/js_test/functional/.tmp_cds_test.html +++ /dev/null @@ -1,306 +0,0 @@ - - - - - Calendar Date Select Test Cases - - - - - - - - - - - -
- - -
- -
- - - - - \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/js_test/functional/cds_test.html b/timcharper-calendar_date_select-d3b2b8c/js_test/functional/cds_test.html deleted file mode 100755 index cac6df2..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/js_test/functional/cds_test.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - Calendar Date Select Test Cases - - - - - - - - - - - -
- - -
- -
- - - - - \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/js_test/functional/format_iso_date_test.html b/timcharper-calendar_date_select-d3b2b8c/js_test/functional/format_iso_date_test.html deleted file mode 100755 index 60b4d94..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/js_test/functional/format_iso_date_test.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Format ISO Date Test Cases - - - - - - - - - - - -
- - -
- -
- - - - - \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/js_test/prototype.js b/timcharper-calendar_date_select-d3b2b8c/js_test/prototype.js deleted file mode 100755 index 5c73462..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/js_test/prototype.js +++ /dev/null @@ -1,4184 +0,0 @@ -/* Prototype JavaScript framework, version 1.6.0 - * (c) 2005-2007 Sam Stephenson - * - * Prototype is freely distributable under the terms of an MIT-style license. - * For details, see the Prototype web site: http://www.prototypejs.org/ - * - *--------------------------------------------------------------------------*/ - -var Prototype = { - Version: '1.6.0', - - Browser: { - IE: !!(window.attachEvent && !window.opera), - Opera: !!window.opera, - WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, - Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1, - MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) - }, - - BrowserFeatures: { - XPath: !!document.evaluate, - ElementExtensions: !!window.HTMLElement, - SpecificElementExtensions: - document.createElement('div').__proto__ && - document.createElement('div').__proto__ !== - document.createElement('form').__proto__ - }, - - ScriptFragment: ']*>([\\S\\s]*?)<\/script>', - JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, - - emptyFunction: function() { }, - K: function(x) { return x } -}; - -if (Prototype.Browser.MobileSafari) - Prototype.BrowserFeatures.SpecificElementExtensions = false; - -if (Prototype.Browser.WebKit) - Prototype.BrowserFeatures.XPath = false; - -/* Based on Alex Arnell's inheritance implementation. */ -var Class = { - create: function() { - var parent = null, properties = $A(arguments); - if (Object.isFunction(properties[0])) - parent = properties.shift(); - - function klass() { - this.initialize.apply(this, arguments); - } - - Object.extend(klass, Class.Methods); - klass.superclass = parent; - klass.subclasses = []; - - if (parent) { - var subclass = function() { }; - subclass.prototype = parent.prototype; - klass.prototype = new subclass; - parent.subclasses.push(klass); - } - - for (var i = 0; i < properties.length; i++) - klass.addMethods(properties[i]); - - if (!klass.prototype.initialize) - klass.prototype.initialize = Prototype.emptyFunction; - - klass.prototype.constructor = klass; - - return klass; - } -}; - -Class.Methods = { - addMethods: function(source) { - var ancestor = this.superclass && this.superclass.prototype; - var properties = Object.keys(source); - - if (!Object.keys({ toString: true }).length) - properties.push("toString", "valueOf"); - - for (var i = 0, length = properties.length; i < length; i++) { - var property = properties[i], value = source[property]; - if (ancestor && Object.isFunction(value) && - value.argumentNames().first() == "$super") { - var method = value, value = Object.extend((function(m) { - return function() { return ancestor[m].apply(this, arguments) }; - })(property).wrap(method), { - valueOf: function() { return method }, - toString: function() { return method.toString() } - }); - } - this.prototype[property] = value; - } - - return this; - } -}; - -var Abstract = { }; - -Object.extend = function(destination, source) { - for (var property in source) - destination[property] = source[property]; - return destination; -}; - -Object.extend(Object, { - inspect: function(object) { - try { - if (object === undefined) return 'undefined'; - if (object === null) return 'null'; - return object.inspect ? object.inspect() : object.toString(); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } - }, - - toJSON: function(object) { - var type = typeof object; - switch (type) { - case 'undefined': - case 'function': - case 'unknown': return; - case 'boolean': return object.toString(); - } - - if (object === null) return 'null'; - if (object.toJSON) return object.toJSON(); - if (Object.isElement(object)) return; - - var results = []; - for (var property in object) { - var value = Object.toJSON(object[property]); - if (value !== undefined) - results.push(property.toJSON() + ': ' + value); - } - - return '{' + results.join(', ') + '}'; - }, - - toQueryString: function(object) { - return $H(object).toQueryString(); - }, - - toHTML: function(object) { - return object && object.toHTML ? object.toHTML() : String.interpret(object); - }, - - keys: function(object) { - var keys = []; - for (var property in object) - keys.push(property); - return keys; - }, - - values: function(object) { - var values = []; - for (var property in object) - values.push(object[property]); - return values; - }, - - clone: function(object) { - return Object.extend({ }, object); - }, - - isElement: function(object) { - return object && object.nodeType == 1; - }, - - isArray: function(object) { - return object && object.constructor === Array; - }, - - isHash: function(object) { - return object instanceof Hash; - }, - - isFunction: function(object) { - return typeof object == "function"; - }, - - isString: function(object) { - return typeof object == "string"; - }, - - isNumber: function(object) { - return typeof object == "number"; - }, - - isUndefined: function(object) { - return typeof object == "undefined"; - } -}); - -Object.extend(Function.prototype, { - argumentNames: function() { - var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip"); - return names.length == 1 && !names[0] ? [] : names; - }, - - bind: function() { - if (arguments.length < 2 && arguments[0] === undefined) return this; - var __method = this, args = $A(arguments), object = args.shift(); - return function() { - return __method.apply(object, args.concat($A(arguments))); - } - }, - - bindAsEventListener: function() { - var __method = this, args = $A(arguments), object = args.shift(); - return function(event) { - return __method.apply(object, [event || window.event].concat(args)); - } - }, - - curry: function() { - if (!arguments.length) return this; - var __method = this, args = $A(arguments); - return function() { - return __method.apply(this, args.concat($A(arguments))); - } - }, - - delay: function() { - var __method = this, args = $A(arguments), timeout = args.shift() * 1000; - return window.setTimeout(function() { - return __method.apply(__method, args); - }, timeout); - }, - - wrap: function(wrapper) { - var __method = this; - return function() { - return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); - } - }, - - methodize: function() { - if (this._methodized) return this._methodized; - var __method = this; - return this._methodized = function() { - return __method.apply(null, [this].concat($A(arguments))); - }; - } -}); - -Function.prototype.defer = Function.prototype.delay.curry(0.01); - -Date.prototype.toJSON = function() { - return '"' + this.getUTCFullYear() + '-' + - (this.getUTCMonth() + 1).toPaddedString(2) + '-' + - this.getUTCDate().toPaddedString(2) + 'T' + - this.getUTCHours().toPaddedString(2) + ':' + - this.getUTCMinutes().toPaddedString(2) + ':' + - this.getUTCSeconds().toPaddedString(2) + 'Z"'; -}; - -var Try = { - these: function() { - var returnValue; - - for (var i = 0, length = arguments.length; i < length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) { } - } - - return returnValue; - } -}; - -RegExp.prototype.match = RegExp.prototype.test; - -RegExp.escape = function(str) { - return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); -}; - -/*--------------------------------------------------------------------------*/ - -var PeriodicalExecuter = Class.create({ - initialize: function(callback, frequency) { - this.callback = callback; - this.frequency = frequency; - this.currentlyExecuting = false; - - this.registerCallback(); - }, - - registerCallback: function() { - this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - execute: function() { - this.callback(this); - }, - - stop: function() { - if (!this.timer) return; - clearInterval(this.timer); - this.timer = null; - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.execute(); - } finally { - this.currentlyExecuting = false; - } - } - } -}); -Object.extend(String, { - interpret: function(value) { - return value == null ? '' : String(value); - }, - specialChar: { - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '\\': '\\\\' - } -}); - -Object.extend(String.prototype, { - gsub: function(pattern, replacement) { - var result = '', source = this, match; - replacement = arguments.callee.prepareReplacement(replacement); - - while (source.length > 0) { - if (match = source.match(pattern)) { - result += source.slice(0, match.index); - result += String.interpret(replacement(match)); - source = source.slice(match.index + match[0].length); - } else { - result += source, source = ''; - } - } - return result; - }, - - sub: function(pattern, replacement, count) { - replacement = this.gsub.prepareReplacement(replacement); - count = count === undefined ? 1 : count; - - return this.gsub(pattern, function(match) { - if (--count < 0) return match[0]; - return replacement(match); - }); - }, - - scan: function(pattern, iterator) { - this.gsub(pattern, iterator); - return String(this); - }, - - truncate: function(length, truncation) { - length = length || 30; - truncation = truncation === undefined ? '...' : truncation; - return this.length > length ? - this.slice(0, length - truncation.length) + truncation : String(this); - }, - - strip: function() { - return this.replace(/^\s+/, '').replace(/\s+$/, ''); - }, - - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, - - stripScripts: function() { - return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, - - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); - return (this.match(matchAll) || []).map(function(scriptTag) { - return (scriptTag.match(matchOne) || ['', ''])[1]; - }); - }, - - evalScripts: function() { - return this.extractScripts().map(function(script) { return eval(script) }); - }, - - escapeHTML: function() { - var self = arguments.callee; - self.text.data = this; - return self.div.innerHTML; - }, - - unescapeHTML: function() { - var div = new Element('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? (div.childNodes.length > 1 ? - $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : - div.childNodes[0].nodeValue) : ''; - }, - - toQueryParams: function(separator) { - var match = this.strip().match(/([^?#]*)(#.*)?$/); - if (!match) return { }; - - return match[1].split(separator || '&').inject({ }, function(hash, pair) { - if ((pair = pair.split('='))[0]) { - var key = decodeURIComponent(pair.shift()); - var value = pair.length > 1 ? pair.join('=') : pair[0]; - if (value != undefined) value = decodeURIComponent(value); - - if (key in hash) { - if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; - hash[key].push(value); - } - else hash[key] = value; - } - return hash; - }); - }, - - toArray: function() { - return this.split(''); - }, - - succ: function() { - return this.slice(0, this.length - 1) + - String.fromCharCode(this.charCodeAt(this.length - 1) + 1); - }, - - times: function(count) { - return count < 1 ? '' : new Array(count + 1).join(this); - }, - - camelize: function() { - var parts = this.split('-'), len = parts.length; - if (len == 1) return parts[0]; - - var camelized = this.charAt(0) == '-' - ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) - : parts[0]; - - for (var i = 1; i < len; i++) - camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); - - return camelized; - }, - - capitalize: function() { - return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); - }, - - underscore: function() { - return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); - }, - - dasherize: function() { - return this.gsub(/_/,'-'); - }, - - inspect: function(useDoubleQuotes) { - var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { - var character = String.specialChar[match[0]]; - return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); - }); - if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; - return "'" + escapedString.replace(/'/g, '\\\'') + "'"; - }, - - toJSON: function() { - return this.inspect(true); - }, - - unfilterJSON: function(filter) { - return this.sub(filter || Prototype.JSONFilter, '#{1}'); - }, - - isJSON: function() { - var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); - return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); - }, - - evalJSON: function(sanitize) { - var json = this.unfilterJSON(); - try { - if (!sanitize || json.isJSON()) return eval('(' + json + ')'); - } catch (e) { } - throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); - }, - - include: function(pattern) { - return this.indexOf(pattern) > -1; - }, - - startsWith: function(pattern) { - return this.indexOf(pattern) === 0; - }, - - endsWith: function(pattern) { - var d = this.length - pattern.length; - return d >= 0 && this.lastIndexOf(pattern) === d; - }, - - empty: function() { - return this == ''; - }, - - blank: function() { - return /^\s*$/.test(this); - }, - - interpolate: function(object, pattern) { - return new Template(this, pattern).evaluate(object); - } -}); - -if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { - escapeHTML: function() { - return this.replace(/&/g,'&').replace(//g,'>'); - }, - unescapeHTML: function() { - return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); - } -}); - -String.prototype.gsub.prepareReplacement = function(replacement) { - if (Object.isFunction(replacement)) return replacement; - var template = new Template(replacement); - return function(match) { return template.evaluate(match) }; -}; - -String.prototype.parseQuery = String.prototype.toQueryParams; - -Object.extend(String.prototype.escapeHTML, { - div: document.createElement('div'), - text: document.createTextNode('') -}); - -with (String.prototype.escapeHTML) div.appendChild(text); - -var Template = Class.create({ - initialize: function(template, pattern) { - this.template = template.toString(); - this.pattern = pattern || Template.Pattern; - }, - - evaluate: function(object) { - if (Object.isFunction(object.toTemplateReplacements)) - object = object.toTemplateReplacements(); - - return this.template.gsub(this.pattern, function(match) { - if (object == null) return ''; - - var before = match[1] || ''; - if (before == '\\') return match[2]; - - var ctx = object, expr = match[3]; - var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr); - if (match == null) return before; - - while (match != null) { - var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; - ctx = ctx[comp]; - if (null == ctx || '' == match[3]) break; - expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); - match = pattern.exec(expr); - } - - return before + String.interpret(ctx); - }.bind(this)); - } -}); -Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; - -var $break = { }; - -var Enumerable = { - each: function(iterator, context) { - var index = 0; - iterator = iterator.bind(context); - try { - this._each(function(value) { - iterator(value, index++); - }); - } catch (e) { - if (e != $break) throw e; - } - return this; - }, - - eachSlice: function(number, iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var index = -number, slices = [], array = this.toArray(); - while ((index += number) < array.length) - slices.push(array.slice(index, index+number)); - return slices.collect(iterator, context); - }, - - all: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result = true; - this.each(function(value, index) { - result = result && !!iterator(value, index); - if (!result) throw $break; - }); - return result; - }, - - any: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result = false; - this.each(function(value, index) { - if (result = !!iterator(value, index)) - throw $break; - }); - return result; - }, - - collect: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var results = []; - this.each(function(value, index) { - results.push(iterator(value, index)); - }); - return results; - }, - - detect: function(iterator, context) { - iterator = iterator.bind(context); - var result; - this.each(function(value, index) { - if (iterator(value, index)) { - result = value; - throw $break; - } - }); - return result; - }, - - findAll: function(iterator, context) { - iterator = iterator.bind(context); - var results = []; - this.each(function(value, index) { - if (iterator(value, index)) - results.push(value); - }); - return results; - }, - - grep: function(filter, iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var results = []; - - if (Object.isString(filter)) - filter = new RegExp(filter); - - this.each(function(value, index) { - if (filter.match(value)) - results.push(iterator(value, index)); - }); - return results; - }, - - include: function(object) { - if (Object.isFunction(this.indexOf)) - if (this.indexOf(object) != -1) return true; - - var found = false; - this.each(function(value) { - if (value == object) { - found = true; - throw $break; - } - }); - return found; - }, - - inGroupsOf: function(number, fillWith) { - fillWith = fillWith === undefined ? null : fillWith; - return this.eachSlice(number, function(slice) { - while(slice.length < number) slice.push(fillWith); - return slice; - }); - }, - - inject: function(memo, iterator, context) { - iterator = iterator.bind(context); - this.each(function(value, index) { - memo = iterator(memo, value, index); - }); - return memo; - }, - - invoke: function(method) { - var args = $A(arguments).slice(1); - return this.map(function(value) { - return value[method].apply(value, args); - }); - }, - - max: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result; - this.each(function(value, index) { - value = iterator(value, index); - if (result == undefined || value >= result) - result = value; - }); - return result; - }, - - min: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var result; - this.each(function(value, index) { - value = iterator(value, index); - if (result == undefined || value < result) - result = value; - }); - return result; - }, - - partition: function(iterator, context) { - iterator = iterator ? iterator.bind(context) : Prototype.K; - var trues = [], falses = []; - this.each(function(value, index) { - (iterator(value, index) ? - trues : falses).push(value); - }); - return [trues, falses]; - }, - - pluck: function(property) { - var results = []; - this.each(function(value) { - results.push(value[property]); - }); - return results; - }, - - reject: function(iterator, context) { - iterator = iterator.bind(context); - var results = []; - this.each(function(value, index) { - if (!iterator(value, index)) - results.push(value); - }); - return results; - }, - - sortBy: function(iterator, context) { - iterator = iterator.bind(context); - return this.map(function(value, index) { - return {value: value, criteria: iterator(value, index)}; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }).pluck('value'); - }, - - toArray: function() { - return this.map(); - }, - - zip: function() { - var iterator = Prototype.K, args = $A(arguments); - if (Object.isFunction(args.last())) - iterator = args.pop(); - - var collections = [this].concat(args).map($A); - return this.map(function(value, index) { - return iterator(collections.pluck(index)); - }); - }, - - size: function() { - return this.toArray().length; - }, - - inspect: function() { - return '#'; - } -}; - -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - filter: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray, - every: Enumerable.all, - some: Enumerable.any -}); -function $A(iterable) { - if (!iterable) return []; - if (iterable.toArray) return iterable.toArray(); - var length = iterable.length, results = new Array(length); - while (length--) results[length] = iterable[length]; - return results; -} - -if (Prototype.Browser.WebKit) { - function $A(iterable) { - if (!iterable) return []; - if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') && - iterable.toArray) return iterable.toArray(); - var length = iterable.length, results = new Array(length); - while (length--) results[length] = iterable[length]; - return results; - } -} - -Array.from = $A; - -Object.extend(Array.prototype, Enumerable); - -if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0, length = this.length; i < length; i++) - iterator(this[i]); - }, - - clear: function() { - this.length = 0; - return this; - }, - - first: function() { - return this[0]; - }, - - last: function() { - return this[this.length - 1]; - }, - - compact: function() { - return this.select(function(value) { - return value != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(Object.isArray(value) ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - reduce: function() { - return this.length > 1 ? this : this[0]; - }, - - uniq: function(sorted) { - return this.inject([], function(array, value, index) { - if (0 == index || (sorted ? array.last() != value : !array.include(value))) - array.push(value); - return array; - }); - }, - - intersect: function(array) { - return this.uniq().findAll(function(item) { - return array.detect(function(value) { return item === value }); - }); - }, - - clone: function() { - return [].concat(this); - }, - - size: function() { - return this.length; - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - }, - - toJSON: function() { - var results = []; - this.each(function(object) { - var value = Object.toJSON(object); - if (value !== undefined) results.push(value); - }); - return '[' + results.join(', ') + ']'; - } -}); - -// use native browser JS 1.6 implementation if available -if (Object.isFunction(Array.prototype.forEach)) - Array.prototype._each = Array.prototype.forEach; - -if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { - i || (i = 0); - var length = this.length; - if (i < 0) i = length + i; - for (; i < length; i++) - if (this[i] === item) return i; - return -1; -}; - -if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { - i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; - var n = this.slice(0, i).reverse().indexOf(item); - return (n < 0) ? n : i - n - 1; -}; - -Array.prototype.toArray = Array.prototype.clone; - -function $w(string) { - if (!Object.isString(string)) return []; - string = string.strip(); - return string ? string.split(/\s+/) : []; -} - -if (Prototype.Browser.Opera){ - Array.prototype.concat = function() { - var array = []; - for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); - for (var i = 0, length = arguments.length; i < length; i++) { - if (Object.isArray(arguments[i])) { - for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) - array.push(arguments[i][j]); - } else { - array.push(arguments[i]); - } - } - return array; - }; -} -Object.extend(Number.prototype, { - toColorPart: function() { - return this.toPaddedString(2, 16); - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator) { - $R(0, this, true).each(iterator); - return this; - }, - - toPaddedString: function(length, radix) { - var string = this.toString(radix || 10); - return '0'.times(length - string.length) + string; - }, - - toJSON: function() { - return isFinite(this) ? this.toString() : 'null'; - } -}); - -$w('abs round ceil floor').each(function(method){ - Number.prototype[method] = Math[method].methodize(); -}); -function $H(object) { - return new Hash(object); -}; - -var Hash = Class.create(Enumerable, (function() { - if (function() { - var i = 0, Test = function(value) { this.key = value }; - Test.prototype.key = 'foo'; - for (var property in new Test('bar')) i++; - return i > 1; - }()) { - function each(iterator) { - var cache = []; - for (var key in this._object) { - var value = this._object[key]; - if (cache.include(key)) continue; - cache.push(key); - var pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - } - } else { - function each(iterator) { - for (var key in this._object) { - var value = this._object[key], pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - } - } - - function toQueryPair(key, value) { - if (Object.isUndefined(value)) return key; - return key + '=' + encodeURIComponent(String.interpret(value)); - } - - return { - initialize: function(object) { - this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); - }, - - _each: each, - - set: function(key, value) { - return this._object[key] = value; - }, - - get: function(key) { - return this._object[key]; - }, - - unset: function(key) { - var value = this._object[key]; - delete this._object[key]; - return value; - }, - - toObject: function() { - return Object.clone(this._object); - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - index: function(value) { - var match = this.detect(function(pair) { - return pair.value === value; - }); - return match && match.key; - }, - - merge: function(object) { - return this.clone().update(object); - }, - - update: function(object) { - return new Hash(object).inject(this, function(result, pair) { - result.set(pair.key, pair.value); - return result; - }); - }, - - toQueryString: function() { - return this.map(function(pair) { - var key = encodeURIComponent(pair.key), values = pair.value; - - if (values && typeof values == 'object') { - if (Object.isArray(values)) - return values.map(toQueryPair.curry(key)).join('&'); - } - return toQueryPair(key, values); - }).join('&'); - }, - - inspect: function() { - return '#'; - }, - - toJSON: function() { - return Object.toJSON(this.toObject()); - }, - - clone: function() { - return new Hash(this); - } - } -})()); - -Hash.prototype.toTemplateReplacements = Hash.prototype.toObject; -Hash.from = $H; -var ObjectRange = Class.create(Enumerable, { - initialize: function(start, end, exclusive) { - this.start = start; - this.end = end; - this.exclusive = exclusive; - }, - - _each: function(iterator) { - var value = this.start; - while (this.include(value)) { - iterator(value); - value = value.succ(); - } - }, - - include: function(value) { - if (value < this.start) - return false; - if (this.exclusive) - return value < this.end; - return value <= this.end; - } -}); - -var $R = function(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); -}; - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new XMLHttpRequest()}, - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')} - ) || false; - }, - - activeRequestCount: 0 -}; - -Ajax.Responders = { - responders: [], - - _each: function(iterator) { - this.responders._each(iterator); - }, - - register: function(responder) { - if (!this.include(responder)) - this.responders.push(responder); - }, - - unregister: function(responder) { - this.responders = this.responders.without(responder); - }, - - dispatch: function(callback, request, transport, json) { - this.each(function(responder) { - if (Object.isFunction(responder[callback])) { - try { - responder[callback].apply(responder, [request, transport, json]); - } catch (e) { } - } - }); - } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ - onCreate: function() { Ajax.activeRequestCount++ }, - onComplete: function() { Ajax.activeRequestCount-- } -}); - -Ajax.Base = Class.create({ - initialize: function(options) { - this.options = { - method: 'post', - asynchronous: true, - contentType: 'application/x-www-form-urlencoded', - encoding: 'UTF-8', - parameters: '', - evalJSON: true, - evalJS: true - }; - Object.extend(this.options, options || { }); - - this.options.method = this.options.method.toLowerCase(); - if (Object.isString(this.options.parameters)) - this.options.parameters = this.options.parameters.toQueryParams(); - } -}); - -Ajax.Request = Class.create(Ajax.Base, { - _complete: false, - - initialize: function($super, url, options) { - $super(options); - this.transport = Ajax.getTransport(); - this.request(url); - }, - - request: function(url) { - this.url = url; - this.method = this.options.method; - var params = Object.clone(this.options.parameters); - - if (!['get', 'post'].include(this.method)) { - // simulate other verbs over post - params['_method'] = this.method; - this.method = 'post'; - } - - this.parameters = params; - - if (params = Object.toQueryString(params)) { - // when GET, append parameters to URL - if (this.method == 'get') - this.url += (this.url.include('?') ? '&' : '?') + params; - else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) - params += '&_='; - } - - try { - var response = new Ajax.Response(this); - if (this.options.onCreate) this.options.onCreate(response); - Ajax.Responders.dispatch('onCreate', this, response); - - this.transport.open(this.method.toUpperCase(), this.url, - this.options.asynchronous); - - if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); - - this.transport.onreadystatechange = this.onStateChange.bind(this); - this.setRequestHeaders(); - - this.body = this.method == 'post' ? (this.options.postBody || params) : null; - this.transport.send(this.body); - - /* Force Firefox to handle ready state 4 for synchronous requests */ - if (!this.options.asynchronous && this.transport.overrideMimeType) - this.onStateChange(); - - } - catch (e) { - this.dispatchException(e); - } - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState > 1 && !((readyState == 4) && this._complete)) - this.respondToReadyState(this.transport.readyState); - }, - - setRequestHeaders: function() { - var headers = { - 'X-Requested-With': 'XMLHttpRequest', - 'X-Prototype-Version': Prototype.Version, - 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' - }; - - if (this.method == 'post') { - headers['Content-type'] = this.options.contentType + - (this.options.encoding ? '; charset=' + this.options.encoding : ''); - - /* Force "Connection: close" for older Mozilla browsers to work - * around a bug where XMLHttpRequest sends an incorrect - * Content-length header. See Mozilla Bugzilla #246651. - */ - if (this.transport.overrideMimeType && - (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) - headers['Connection'] = 'close'; - } - - // user-defined headers - if (typeof this.options.requestHeaders == 'object') { - var extras = this.options.requestHeaders; - - if (Object.isFunction(extras.push)) - for (var i = 0, length = extras.length; i < length; i += 2) - headers[extras[i]] = extras[i+1]; - else - $H(extras).each(function(pair) { headers[pair.key] = pair.value }); - } - - for (var name in headers) - this.transport.setRequestHeader(name, headers[name]); - }, - - success: function() { - var status = this.getStatus(); - return !status || (status >= 200 && status < 300); - }, - - getStatus: function() { - try { - return this.transport.status || 0; - } catch (e) { return 0 } - }, - - respondToReadyState: function(readyState) { - var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); - - if (state == 'Complete') { - try { - this._complete = true; - (this.options['on' + response.status] - || this.options['on' + (this.success() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - var contentType = response.getHeader('Content-type'); - if (this.options.evalJS == 'force' - || (this.options.evalJS && contentType - && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) - this.evalResponse(); - } - - try { - (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); - Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); - } catch (e) { - this.dispatchException(e); - } - - if (state == 'Complete') { - // avoid memory leak in MSIE: clean up - this.transport.onreadystatechange = Prototype.emptyFunction; - } - }, - - getHeader: function(name) { - try { - return this.transport.getResponseHeader(name); - } catch (e) { return null } - }, - - evalResponse: function() { - try { - return eval((this.transport.responseText || '').unfilterJSON()); - } catch (e) { - this.dispatchException(e); - } - }, - - dispatchException: function(exception) { - (this.options.onException || Prototype.emptyFunction)(this, exception); - Ajax.Responders.dispatch('onException', this, exception); - } -}); - -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Response = Class.create({ - initialize: function(request){ - this.request = request; - var transport = this.transport = request.transport, - readyState = this.readyState = transport.readyState; - - if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { - this.status = this.getStatus(); - this.statusText = this.getStatusText(); - this.responseText = String.interpret(transport.responseText); - this.headerJSON = this._getHeaderJSON(); - } - - if(readyState == 4) { - var xml = transport.responseXML; - this.responseXML = xml === undefined ? null : xml; - this.responseJSON = this._getResponseJSON(); - } - }, - - status: 0, - statusText: '', - - getStatus: Ajax.Request.prototype.getStatus, - - getStatusText: function() { - try { - return this.transport.statusText || ''; - } catch (e) { return '' } - }, - - getHeader: Ajax.Request.prototype.getHeader, - - getAllHeaders: function() { - try { - return this.getAllResponseHeaders(); - } catch (e) { return null } - }, - - getResponseHeader: function(name) { - return this.transport.getResponseHeader(name); - }, - - getAllResponseHeaders: function() { - return this.transport.getAllResponseHeaders(); - }, - - _getHeaderJSON: function() { - var json = this.getHeader('X-JSON'); - if (!json) return null; - json = decodeURIComponent(escape(json)); - try { - return json.evalJSON(this.request.options.sanitizeJSON); - } catch (e) { - this.request.dispatchException(e); - } - }, - - _getResponseJSON: function() { - var options = this.request.options; - if (!options.evalJSON || (options.evalJSON != 'force' && - !(this.getHeader('Content-type') || '').include('application/json'))) - return null; - try { - return this.transport.responseText.evalJSON(options.sanitizeJSON); - } catch (e) { - this.request.dispatchException(e); - } - } -}); - -Ajax.Updater = Class.create(Ajax.Request, { - initialize: function($super, container, url, options) { - this.container = { - success: (container.success || container), - failure: (container.failure || (container.success ? null : container)) - }; - - options = options || { }; - var onComplete = options.onComplete; - options.onComplete = (function(response, param) { - this.updateContent(response.responseText); - if (Object.isFunction(onComplete)) onComplete(response, param); - }).bind(this); - - $super(url, options); - }, - - updateContent: function(responseText) { - var receiver = this.container[this.success() ? 'success' : 'failure'], - options = this.options; - - if (!options.evalScripts) responseText = responseText.stripScripts(); - - if (receiver = $(receiver)) { - if (options.insertion) { - if (Object.isString(options.insertion)) { - var insertion = { }; insertion[options.insertion] = responseText; - receiver.insert(insertion); - } - else options.insertion(receiver, responseText); - } - else receiver.update(responseText); - } - - if (this.success()) { - if (this.onComplete) this.onComplete.bind(this).defer(); - } - } -}); - -Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { - initialize: function($super, container, url, options) { - $super(options); - this.onComplete = this.options.onComplete; - - this.frequency = (this.options.frequency || 2); - this.decay = (this.options.decay || 1); - - this.updater = { }; - this.container = container; - this.url = url; - - this.start(); - }, - - start: function() { - this.options.onComplete = this.updateComplete.bind(this); - this.onTimerEvent(); - }, - - stop: function() { - this.updater.options.onComplete = undefined; - clearTimeout(this.timer); - (this.onComplete || Prototype.emptyFunction).apply(this, arguments); - }, - - updateComplete: function(response) { - if (this.options.decay) { - this.decay = (response.responseText == this.lastText ? - this.decay * this.options.decay : 1); - - this.lastText = response.responseText; - } - this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); - }, - - onTimerEvent: function() { - this.updater = new Ajax.Updater(this.container, this.url, this.options); - } -}); -function $(element) { - if (arguments.length > 1) { - for (var i = 0, elements = [], length = arguments.length; i < length; i++) - elements.push($(arguments[i])); - return elements; - } - if (Object.isString(element)) - element = document.getElementById(element); - return Element.extend(element); -} - -if (Prototype.BrowserFeatures.XPath) { - document._getElementsByXPath = function(expression, parentElement) { - var results = []; - var query = document.evaluate(expression, $(parentElement) || document, - null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); - for (var i = 0, length = query.snapshotLength; i < length; i++) - results.push(Element.extend(query.snapshotItem(i))); - return results; - }; -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Node) var Node = { }; - -if (!Node.ELEMENT_NODE) { - // DOM level 2 ECMAScript Language Binding - Object.extend(Node, { - ELEMENT_NODE: 1, - ATTRIBUTE_NODE: 2, - TEXT_NODE: 3, - CDATA_SECTION_NODE: 4, - ENTITY_REFERENCE_NODE: 5, - ENTITY_NODE: 6, - PROCESSING_INSTRUCTION_NODE: 7, - COMMENT_NODE: 8, - DOCUMENT_NODE: 9, - DOCUMENT_TYPE_NODE: 10, - DOCUMENT_FRAGMENT_NODE: 11, - NOTATION_NODE: 12 - }); -} - -(function() { - var element = this.Element; - this.Element = function(tagName, attributes) { - attributes = attributes || { }; - tagName = tagName.toLowerCase(); - var cache = Element.cache; - if (Prototype.Browser.IE && attributes.name) { - tagName = '<' + tagName + ' name="' + attributes.name + '">'; - delete attributes.name; - return Element.writeAttribute(document.createElement(tagName), attributes); - } - if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); - return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); - }; - Object.extend(this.Element, element || { }); -}).call(window); - -Element.cache = { }; - -Element.Methods = { - visible: function(element) { - return $(element).style.display != 'none'; - }, - - toggle: function(element) { - element = $(element); - Element[Element.visible(element) ? 'hide' : 'show'](element); - return element; - }, - - hide: function(element) { - $(element).style.display = 'none'; - return element; - }, - - show: function(element) { - $(element).style.display = ''; - return element; - }, - - remove: function(element) { - element = $(element); - element.parentNode.removeChild(element); - return element; - }, - - update: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - content = Object.toHTML(content); - element.innerHTML = content.stripScripts(); - content.evalScripts.bind(content).defer(); - return element; - }, - - replace: function(element, content) { - element = $(element); - if (content && content.toElement) content = content.toElement(); - else if (!Object.isElement(content)) { - content = Object.toHTML(content); - var range = element.ownerDocument.createRange(); - range.selectNode(element); - content.evalScripts.bind(content).defer(); - content = range.createContextualFragment(content.stripScripts()); - } - element.parentNode.replaceChild(content, element); - return element; - }, - - insert: function(element, insertions) { - element = $(element); - - if (Object.isString(insertions) || Object.isNumber(insertions) || - Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) - insertions = {bottom:insertions}; - - var content, t, range; - - for (position in insertions) { - content = insertions[position]; - position = position.toLowerCase(); - t = Element._insertionTranslations[position]; - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - t.insert(element, content); - continue; - } - - content = Object.toHTML(content); - - range = element.ownerDocument.createRange(); - t.initializeRange(element, range); - t.insert(element, range.createContextualFragment(content.stripScripts())); - - content.evalScripts.bind(content).defer(); - } - - return element; - }, - - wrap: function(element, wrapper, attributes) { - element = $(element); - if (Object.isElement(wrapper)) - $(wrapper).writeAttribute(attributes || { }); - else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); - else wrapper = new Element('div', wrapper); - if (element.parentNode) - element.parentNode.replaceChild(wrapper, element); - wrapper.appendChild(element); - return wrapper; - }, - - inspect: function(element) { - element = $(element); - var result = '<' + element.tagName.toLowerCase(); - $H({'id': 'id', 'className': 'class'}).each(function(pair) { - var property = pair.first(), attribute = pair.last(); - var value = (element[property] || '').toString(); - if (value) result += ' ' + attribute + '=' + value.inspect(true); - }); - return result + '>'; - }, - - recursivelyCollect: function(element, property) { - element = $(element); - var elements = []; - while (element = element[property]) - if (element.nodeType == 1) - elements.push(Element.extend(element)); - return elements; - }, - - ancestors: function(element) { - return $(element).recursivelyCollect('parentNode'); - }, - - descendants: function(element) { - return $A($(element).getElementsByTagName('*')).each(Element.extend); - }, - - firstDescendant: function(element) { - element = $(element).firstChild; - while (element && element.nodeType != 1) element = element.nextSibling; - return $(element); - }, - - immediateDescendants: function(element) { - if (!(element = $(element).firstChild)) return []; - while (element && element.nodeType != 1) element = element.nextSibling; - if (element) return [element].concat($(element).nextSiblings()); - return []; - }, - - previousSiblings: function(element) { - return $(element).recursivelyCollect('previousSibling'); - }, - - nextSiblings: function(element) { - return $(element).recursivelyCollect('nextSibling'); - }, - - siblings: function(element) { - element = $(element); - return element.previousSiblings().reverse().concat(element.nextSiblings()); - }, - - match: function(element, selector) { - if (Object.isString(selector)) - selector = new Selector(selector); - return selector.match($(element)); - }, - - up: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(element.parentNode); - var ancestors = element.ancestors(); - return expression ? Selector.findElement(ancestors, expression, index) : - ancestors[index || 0]; - }, - - down: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return element.firstDescendant(); - var descendants = element.descendants(); - return expression ? Selector.findElement(descendants, expression, index) : - descendants[index || 0]; - }, - - previous: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); - var previousSiblings = element.previousSiblings(); - return expression ? Selector.findElement(previousSiblings, expression, index) : - previousSiblings[index || 0]; - }, - - next: function(element, expression, index) { - element = $(element); - if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); - var nextSiblings = element.nextSiblings(); - return expression ? Selector.findElement(nextSiblings, expression, index) : - nextSiblings[index || 0]; - }, - - select: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element, args); - }, - - adjacent: function() { - var args = $A(arguments), element = $(args.shift()); - return Selector.findChildElements(element.parentNode, args).without(element); - }, - - identify: function(element) { - element = $(element); - var id = element.readAttribute('id'), self = arguments.callee; - if (id) return id; - do { id = 'anonymous_element_' + self.counter++ } while ($(id)); - element.writeAttribute('id', id); - return id; - }, - - readAttribute: function(element, name) { - element = $(element); - if (Prototype.Browser.IE) { - var t = Element._attributeTranslations.read; - if (t.values[name]) return t.values[name](element, name); - if (t.names[name]) name = t.names[name]; - if (name.include(':')) { - return (!element.attributes || !element.attributes[name]) ? null : - element.attributes[name].value; - } - } - return element.getAttribute(name); - }, - - writeAttribute: function(element, name, value) { - element = $(element); - var attributes = { }, t = Element._attributeTranslations.write; - - if (typeof name == 'object') attributes = name; - else attributes[name] = value === undefined ? true : value; - - for (var attr in attributes) { - var name = t.names[attr] || attr, value = attributes[attr]; - if (t.values[attr]) name = t.values[attr](element, value); - if (value === false || value === null) - element.removeAttribute(name); - else if (value === true) - element.setAttribute(name, name); - else element.setAttribute(name, value); - } - return element; - }, - - getHeight: function(element) { - return $(element).getDimensions().height; - }, - - getWidth: function(element) { - return $(element).getDimensions().width; - }, - - classNames: function(element) { - return new Element.ClassNames(element); - }, - - hasClassName: function(element, className) { - if (!(element = $(element))) return; - var elementClassName = element.className; - return (elementClassName.length > 0 && (elementClassName == className || - new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); - }, - - addClassName: function(element, className) { - if (!(element = $(element))) return; - if (!element.hasClassName(className)) - element.className += (element.className ? ' ' : '') + className; - return element; - }, - - removeClassName: function(element, className) { - if (!(element = $(element))) return; - element.className = element.className.replace( - new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); - return element; - }, - - toggleClassName: function(element, className) { - if (!(element = $(element))) return; - return element[element.hasClassName(className) ? - 'removeClassName' : 'addClassName'](className); - }, - - // removes whitespace-only text node children - cleanWhitespace: function(element) { - element = $(element); - var node = element.firstChild; - while (node) { - var nextNode = node.nextSibling; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) - element.removeChild(node); - node = nextNode; - } - return element; - }, - - empty: function(element) { - return $(element).innerHTML.blank(); - }, - - descendantOf: function(element, ancestor) { - element = $(element), ancestor = $(ancestor); - - if (element.compareDocumentPosition) - return (element.compareDocumentPosition(ancestor) & 8) === 8; - - if (element.sourceIndex && !Prototype.Browser.Opera) { - var e = element.sourceIndex, a = ancestor.sourceIndex, - nextAncestor = ancestor.nextSibling; - if (!nextAncestor) { - do { ancestor = ancestor.parentNode; } - while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode); - } - if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex); - } - - while (element = element.parentNode) - if (element == ancestor) return true; - return false; - }, - - scrollTo: function(element) { - element = $(element); - var pos = element.cumulativeOffset(); - window.scrollTo(pos[0], pos[1]); - return element; - }, - - getStyle: function(element, style) { - element = $(element); - style = style == 'float' ? 'cssFloat' : style.camelize(); - var value = element.style[style]; - if (!value) { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css[style] : null; - } - if (style == 'opacity') return value ? parseFloat(value) : 1.0; - return value == 'auto' ? null : value; - }, - - getOpacity: function(element) { - return $(element).getStyle('opacity'); - }, - - setStyle: function(element, styles) { - element = $(element); - var elementStyle = element.style, match; - if (Object.isString(styles)) { - element.style.cssText += ';' + styles; - return styles.include('opacity') ? - element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; - } - for (var property in styles) - if (property == 'opacity') element.setOpacity(styles[property]); - else - elementStyle[(property == 'float' || property == 'cssFloat') ? - (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') : - property] = styles[property]; - - return element; - }, - - setOpacity: function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - return element; - }, - - getDimensions: function(element) { - element = $(element); - var display = $(element).getStyle('display'); - if (display != 'none' && display != null) // Safari bug - return {width: element.offsetWidth, height: element.offsetHeight}; - - // All *Width and *Height properties give 0 on elements with display none, - // so enable the element temporarily - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - var originalDisplay = els.display; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = 'block'; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = originalDisplay; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - - makePositioned: function(element) { - element = $(element); - var pos = Element.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element._madePositioned = true; - element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, when an - // element is position relative but top and left have not been defined - if (window.opera) { - element.style.top = 0; - element.style.left = 0; - } - } - return element; - }, - - undoPositioned: function(element) { - element = $(element); - if (element._madePositioned) { - element._madePositioned = undefined; - element.style.position = - element.style.top = - element.style.left = - element.style.bottom = - element.style.right = ''; - } - return element; - }, - - makeClipping: function(element) { - element = $(element); - if (element._overflow) return element; - element._overflow = Element.getStyle(element, 'overflow') || 'auto'; - if (element._overflow !== 'hidden') - element.style.overflow = 'hidden'; - return element; - }, - - undoClipping: function(element) { - element = $(element); - if (!element._overflow) return element; - element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; - element._overflow = null; - return element; - }, - - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - if (element.tagName == 'BODY') break; - var p = Element.getStyle(element, 'position'); - if (p == 'relative' || p == 'absolute') break; - } - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - absolutize: function(element) { - element = $(element); - if (element.getStyle('position') == 'absolute') return; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - var offsets = element.positionedOffset(); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.width = width + 'px'; - element.style.height = height + 'px'; - return element; - }, - - relativize: function(element) { - element = $(element); - if (element.getStyle('position') == 'relative') return; - // Position.prepare(); // To be done manually by Scripty when it needs it. - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - return element; - }, - - cumulativeScrollOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return Element._returnOffset(valueL, valueT); - }, - - getOffsetParent: function(element) { - if (element.offsetParent) return $(element.offsetParent); - if (element == document.body) return $(element); - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return $(element); - - return $(document.body); - }, - - viewportOffset: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent == document.body && - Element.getStyle(element, 'position') == 'absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - if (!Prototype.Browser.Opera || element.tagName == 'BODY') { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } - } while (element = element.parentNode); - - return Element._returnOffset(valueL, valueT); - }, - - clonePosition: function(element, source) { - var options = Object.extend({ - setLeft: true, - setTop: true, - setWidth: true, - setHeight: true, - offsetTop: 0, - offsetLeft: 0 - }, arguments[2] || { }); - - // find page position of source - source = $(source); - var p = source.viewportOffset(); - - // find coordinate system to use - element = $(element); - var delta = [0, 0]; - var parent = null; - // delta [0,0] will do fine with position: fixed elements, - // position:absolute needs offsetParent deltas - if (Element.getStyle(element, 'position') == 'absolute') { - parent = element.getOffsetParent(); - delta = parent.viewportOffset(); - } - - // correct by body offsets (fixes Safari) - if (parent == document.body) { - delta[0] -= document.body.offsetLeft; - delta[1] -= document.body.offsetTop; - } - - // set position - if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; - if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; - if (options.setWidth) element.style.width = source.offsetWidth + 'px'; - if (options.setHeight) element.style.height = source.offsetHeight + 'px'; - return element; - } -}; - -Element.Methods.identify.counter = 1; - -Object.extend(Element.Methods, { - getElementsBySelector: Element.Methods.select, - childElements: Element.Methods.immediateDescendants -}); - -Element._attributeTranslations = { - write: { - names: { - className: 'class', - htmlFor: 'for' - }, - values: { } - } -}; - - -if (!document.createRange || Prototype.Browser.Opera) { - Element.Methods.insert = function(element, insertions) { - element = $(element); - - if (Object.isString(insertions) || Object.isNumber(insertions) || - Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) - insertions = { bottom: insertions }; - - var t = Element._insertionTranslations, content, position, pos, tagName; - - for (position in insertions) { - content = insertions[position]; - position = position.toLowerCase(); - pos = t[position]; - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - pos.insert(element, content); - continue; - } - - content = Object.toHTML(content); - tagName = ((position == 'before' || position == 'after') - ? element.parentNode : element).tagName.toUpperCase(); - - if (t.tags[tagName]) { - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - if (position == 'top' || position == 'after') fragments.reverse(); - fragments.each(pos.insert.curry(element)); - } - else element.insertAdjacentHTML(pos.adjacency, content.stripScripts()); - - content.evalScripts.bind(content).defer(); - } - - return element; - }; -} - -if (Prototype.Browser.Opera) { - Element.Methods._getStyle = Element.Methods.getStyle; - Element.Methods.getStyle = function(element, style) { - switch(style) { - case 'left': - case 'top': - case 'right': - case 'bottom': - if (Element._getStyle(element, 'position') == 'static') return null; - default: return Element._getStyle(element, style); - } - }; - Element.Methods._readAttribute = Element.Methods.readAttribute; - Element.Methods.readAttribute = function(element, attribute) { - if (attribute == 'title') return element.title; - return Element._readAttribute(element, attribute); - }; -} - -else if (Prototype.Browser.IE) { - $w('positionedOffset getOffsetParent viewportOffset').each(function(method) { - Element.Methods[method] = Element.Methods[method].wrap( - function(proceed, element) { - element = $(element); - var position = element.getStyle('position'); - if (position != 'static') return proceed(element); - element.setStyle({ position: 'relative' }); - var value = proceed(element); - element.setStyle({ position: position }); - return value; - } - ); - }); - - Element.Methods.getStyle = function(element, style) { - element = $(element); - style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); - var value = element.style[style]; - if (!value && element.currentStyle) value = element.currentStyle[style]; - - if (style == 'opacity') { - if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) - if (value[1]) return parseFloat(value[1]) / 100; - return 1.0; - } - - if (value == 'auto') { - if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) - return element['offset' + style.capitalize()] + 'px'; - return null; - } - return value; - }; - - Element.Methods.setOpacity = function(element, value) { - function stripAlpha(filter){ - return filter.replace(/alpha\([^\)]*\)/gi,''); - } - element = $(element); - var currentStyle = element.currentStyle; - if ((currentStyle && !currentStyle.hasLayout) || - (!currentStyle && element.style.zoom == 'normal')) - element.style.zoom = 1; - - var filter = element.getStyle('filter'), style = element.style; - if (value == 1 || value === '') { - (filter = stripAlpha(filter)) ? - style.filter = filter : style.removeAttribute('filter'); - return element; - } else if (value < 0.00001) value = 0; - style.filter = stripAlpha(filter) + - 'alpha(opacity=' + (value * 100) + ')'; - return element; - }; - - Element._attributeTranslations = { - read: { - names: { - 'class': 'className', - 'for': 'htmlFor' - }, - values: { - _getAttr: function(element, attribute) { - return element.getAttribute(attribute, 2); - }, - _getAttrNode: function(element, attribute) { - var node = element.getAttributeNode(attribute); - return node ? node.value : ""; - }, - _getEv: function(element, attribute) { - var attribute = element.getAttribute(attribute); - return attribute ? attribute.toString().slice(23, -2) : null; - }, - _flag: function(element, attribute) { - return $(element).hasAttribute(attribute) ? attribute : null; - }, - style: function(element) { - return element.style.cssText.toLowerCase(); - }, - title: function(element) { - return element.title; - } - } - } - }; - - Element._attributeTranslations.write = { - names: Object.clone(Element._attributeTranslations.read.names), - values: { - checked: function(element, value) { - element.checked = !!value; - }, - - style: function(element, value) { - element.style.cssText = value ? value : ''; - } - } - }; - - Element._attributeTranslations.has = {}; - - $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + - 'encType maxLength readOnly longDesc').each(function(attr) { - Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; - Element._attributeTranslations.has[attr.toLowerCase()] = attr; - }); - - (function(v) { - Object.extend(v, { - href: v._getAttr, - src: v._getAttr, - type: v._getAttr, - action: v._getAttrNode, - disabled: v._flag, - checked: v._flag, - readonly: v._flag, - multiple: v._flag, - onload: v._getEv, - onunload: v._getEv, - onclick: v._getEv, - ondblclick: v._getEv, - onmousedown: v._getEv, - onmouseup: v._getEv, - onmouseover: v._getEv, - onmousemove: v._getEv, - onmouseout: v._getEv, - onfocus: v._getEv, - onblur: v._getEv, - onkeypress: v._getEv, - onkeydown: v._getEv, - onkeyup: v._getEv, - onsubmit: v._getEv, - onreset: v._getEv, - onselect: v._getEv, - onchange: v._getEv - }); - })(Element._attributeTranslations.read.values); -} - -else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1) ? 0.999999 : - (value === '') ? '' : (value < 0.00001) ? 0 : value; - return element; - }; -} - -else if (Prototype.Browser.WebKit) { - Element.Methods.setOpacity = function(element, value) { - element = $(element); - element.style.opacity = (value == 1 || value === '') ? '' : - (value < 0.00001) ? 0 : value; - - if (value == 1) - if(element.tagName == 'IMG' && element.width) { - element.width++; element.width--; - } else try { - var n = document.createTextNode(' '); - element.appendChild(n); - element.removeChild(n); - } catch (e) { } - - return element; - }; - - // Safari returns margins on body which is incorrect if the child is absolutely - // positioned. For performance reasons, redefine Position.cumulativeOffset for - // KHTML/WebKit only. - Element.Methods.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return Element._returnOffset(valueL, valueT); - }; -} - -if (Prototype.Browser.IE || Prototype.Browser.Opera) { - // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements - Element.Methods.update = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) return element.update().insert(content); - - content = Object.toHTML(content); - var tagName = element.tagName.toUpperCase(); - - if (tagName in Element._insertionTranslations.tags) { - $A(element.childNodes).each(function(node) { element.removeChild(node) }); - Element._getContentFromAnonymousElement(tagName, content.stripScripts()) - .each(function(node) { element.appendChild(node) }); - } - else element.innerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -if (document.createElement('div').outerHTML) { - Element.Methods.replace = function(element, content) { - element = $(element); - - if (content && content.toElement) content = content.toElement(); - if (Object.isElement(content)) { - element.parentNode.replaceChild(content, element); - return element; - } - - content = Object.toHTML(content); - var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); - - if (Element._insertionTranslations.tags[tagName]) { - var nextSibling = element.next(); - var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - parent.removeChild(element); - if (nextSibling) - fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); - else - fragments.each(function(node) { parent.appendChild(node) }); - } - else element.outerHTML = content.stripScripts(); - - content.evalScripts.bind(content).defer(); - return element; - }; -} - -Element._returnOffset = function(l, t) { - var result = [l, t]; - result.left = l; - result.top = t; - return result; -}; - -Element._getContentFromAnonymousElement = function(tagName, html) { - var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; - div.innerHTML = t[0] + html + t[1]; - t[2].times(function() { div = div.firstChild }); - return $A(div.childNodes); -}; - -Element._insertionTranslations = { - before: { - adjacency: 'beforeBegin', - insert: function(element, node) { - element.parentNode.insertBefore(node, element); - }, - initializeRange: function(element, range) { - range.setStartBefore(element); - } - }, - top: { - adjacency: 'afterBegin', - insert: function(element, node) { - element.insertBefore(node, element.firstChild); - }, - initializeRange: function(element, range) { - range.selectNodeContents(element); - range.collapse(true); - } - }, - bottom: { - adjacency: 'beforeEnd', - insert: function(element, node) { - element.appendChild(node); - } - }, - after: { - adjacency: 'afterEnd', - insert: function(element, node) { - element.parentNode.insertBefore(node, element.nextSibling); - }, - initializeRange: function(element, range) { - range.setStartAfter(element); - } - }, - tags: { - TABLE: ['', '
', 1], - TBODY: ['', '
', 2], - TR: ['', '
', 3], - TD: ['
', '
', 4], - SELECT: ['', 1] - } -}; - -(function() { - this.bottom.initializeRange = this.top.initializeRange; - Object.extend(this.tags, { - THEAD: this.tags.TBODY, - TFOOT: this.tags.TBODY, - TH: this.tags.TD - }); -}).call(Element._insertionTranslations); - -Element.Methods.Simulated = { - hasAttribute: function(element, attribute) { - attribute = Element._attributeTranslations.has[attribute] || attribute; - var node = $(element).getAttributeNode(attribute); - return node && node.specified; - } -}; - -Element.Methods.ByTag = { }; - -Object.extend(Element, Element.Methods); - -if (!Prototype.BrowserFeatures.ElementExtensions && - document.createElement('div').__proto__) { - window.HTMLElement = { }; - window.HTMLElement.prototype = document.createElement('div').__proto__; - Prototype.BrowserFeatures.ElementExtensions = true; -} - -Element.extend = (function() { - if (Prototype.BrowserFeatures.SpecificElementExtensions) - return Prototype.K; - - var Methods = { }, ByTag = Element.Methods.ByTag; - - var extend = Object.extend(function(element) { - if (!element || element._extendedByPrototype || - element.nodeType != 1 || element == window) return element; - - var methods = Object.clone(Methods), - tagName = element.tagName, property, value; - - // extend methods for specific tags - if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); - - for (property in methods) { - value = methods[property]; - if (Object.isFunction(value) && !(property in element)) - element[property] = value.methodize(); - } - - element._extendedByPrototype = Prototype.emptyFunction; - return element; - - }, { - refresh: function() { - // extend methods for all tags (Safari doesn't need this) - if (!Prototype.BrowserFeatures.ElementExtensions) { - Object.extend(Methods, Element.Methods); - Object.extend(Methods, Element.Methods.Simulated); - } - } - }); - - extend.refresh(); - return extend; -})(); - -Element.hasAttribute = function(element, attribute) { - if (element.hasAttribute) return element.hasAttribute(attribute); - return Element.Methods.Simulated.hasAttribute(element, attribute); -}; - -Element.addMethods = function(methods) { - var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; - - if (!methods) { - Object.extend(Form, Form.Methods); - Object.extend(Form.Element, Form.Element.Methods); - Object.extend(Element.Methods.ByTag, { - "FORM": Object.clone(Form.Methods), - "INPUT": Object.clone(Form.Element.Methods), - "SELECT": Object.clone(Form.Element.Methods), - "TEXTAREA": Object.clone(Form.Element.Methods) - }); - } - - if (arguments.length == 2) { - var tagName = methods; - methods = arguments[1]; - } - - if (!tagName) Object.extend(Element.Methods, methods || { }); - else { - if (Object.isArray(tagName)) tagName.each(extend); - else extend(tagName); - } - - function extend(tagName) { - tagName = tagName.toUpperCase(); - if (!Element.Methods.ByTag[tagName]) - Element.Methods.ByTag[tagName] = { }; - Object.extend(Element.Methods.ByTag[tagName], methods); - } - - function copy(methods, destination, onlyIfAbsent) { - onlyIfAbsent = onlyIfAbsent || false; - for (var property in methods) { - var value = methods[property]; - if (!Object.isFunction(value)) continue; - if (!onlyIfAbsent || !(property in destination)) - destination[property] = value.methodize(); - } - } - - function findDOMClass(tagName) { - var klass; - var trans = { - "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", - "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", - "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", - "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", - "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": - "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": - "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": - "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": - "FrameSet", "IFRAME": "IFrame" - }; - if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName + 'Element'; - if (window[klass]) return window[klass]; - klass = 'HTML' + tagName.capitalize() + 'Element'; - if (window[klass]) return window[klass]; - - window[klass] = { }; - window[klass].prototype = document.createElement(tagName).__proto__; - return window[klass]; - } - - if (F.ElementExtensions) { - copy(Element.Methods, HTMLElement.prototype); - copy(Element.Methods.Simulated, HTMLElement.prototype, true); - } - - if (F.SpecificElementExtensions) { - for (var tag in Element.Methods.ByTag) { - var klass = findDOMClass(tag); - if (Object.isUndefined(klass)) continue; - copy(T[tag], klass.prototype); - } - } - - Object.extend(Element, Element.Methods); - delete Element.ByTag; - - if (Element.extend.refresh) Element.extend.refresh(); - Element.cache = { }; -}; - -document.viewport = { - getDimensions: function() { - var dimensions = { }; - $w('width height').each(function(d) { - var D = d.capitalize(); - dimensions[d] = self['inner' + D] || - (document.documentElement['client' + D] || document.body['client' + D]); - }); - return dimensions; - }, - - getWidth: function() { - return this.getDimensions().width; - }, - - getHeight: function() { - return this.getDimensions().height; - }, - - getScrollOffsets: function() { - return Element._returnOffset( - window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, - window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); - } -}; -/* Portions of the Selector class are derived from Jack Slocum’s DomQuery, - * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style - * license. Please see http://www.yui-ext.com/ for more information. */ - -var Selector = Class.create({ - initialize: function(expression) { - this.expression = expression.strip(); - this.compileMatcher(); - }, - - compileMatcher: function() { - // Selectors with namespaced attributes can't use the XPath version - if (Prototype.BrowserFeatures.XPath && !(/(\[[\w-]*?:|:checked)/).test(this.expression)) - return this.compileXPathMatcher(); - - var e = this.expression, ps = Selector.patterns, h = Selector.handlers, - c = Selector.criteria, le, p, m; - - if (Selector._cache[e]) { - this.matcher = Selector._cache[e]; - return; - } - - this.matcher = ["this.matcher = function(root) {", - "var r = root, h = Selector.handlers, c = false, n;"]; - - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : - new Template(c[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } - - this.matcher.push("return h.unique(n);\n}"); - eval(this.matcher.join('\n')); - Selector._cache[this.expression] = this.matcher; - }, - - compileXPathMatcher: function() { - var e = this.expression, ps = Selector.patterns, - x = Selector.xpath, le, m; - - if (Selector._cache[e]) { - this.xpath = Selector._cache[e]; return; - } - - this.matcher = ['.//*']; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - if (m = e.match(ps[i])) { - this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : - new Template(x[i]).evaluate(m)); - e = e.replace(m[0], ''); - break; - } - } - } - - this.xpath = this.matcher.join(''); - Selector._cache[this.expression] = this.xpath; - }, - - findElements: function(root) { - root = root || document; - if (this.xpath) return document._getElementsByXPath(this.xpath, root); - return this.matcher(root); - }, - - match: function(element) { - this.tokens = []; - - var e = this.expression, ps = Selector.patterns, as = Selector.assertions; - var le, p, m; - - while (e && le !== e && (/\S/).test(e)) { - le = e; - for (var i in ps) { - p = ps[i]; - if (m = e.match(p)) { - // use the Selector.assertions methods unless the selector - // is too complex. - if (as[i]) { - this.tokens.push([i, Object.clone(m)]); - e = e.replace(m[0], ''); - } else { - // reluctantly do a document-wide search - // and look for a match in the array - return this.findElements(document).include(element); - } - } - } - } - - var match = true, name, matches; - for (var i = 0, token; token = this.tokens[i]; i++) { - name = token[0], matches = token[1]; - if (!Selector.assertions[name](element, matches)) { - match = false; break; - } - } - - return match; - }, - - toString: function() { - return this.expression; - }, - - inspect: function() { - return "#"; - } -}); - -Object.extend(Selector, { - _cache: { }, - - xpath: { - descendant: "//*", - child: "/*", - adjacent: "/following-sibling::*[1]", - laterSibling: '/following-sibling::*', - tagName: function(m) { - if (m[1] == '*') return ''; - return "[local-name()='" + m[1].toLowerCase() + - "' or local-name()='" + m[1].toUpperCase() + "']"; - }, - className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", - id: "[@id='#{1}']", - attrPresence: "[@#{1}]", - attr: function(m) { - m[3] = m[5] || m[6]; - return new Template(Selector.xpath.operators[m[2]]).evaluate(m); - }, - pseudo: function(m) { - var h = Selector.xpath.pseudos[m[1]]; - if (!h) return ''; - if (Object.isFunction(h)) return h(m); - return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); - }, - operators: { - '=': "[@#{1}='#{3}']", - '!=': "[@#{1}!='#{3}']", - '^=': "[starts-with(@#{1}, '#{3}')]", - '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", - '*=': "[contains(@#{1}, '#{3}')]", - '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", - '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" - }, - pseudos: { - 'first-child': '[not(preceding-sibling::*)]', - 'last-child': '[not(following-sibling::*)]', - 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', - 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]", - 'checked': "[@checked]", - 'disabled': "[@disabled]", - 'enabled': "[not(@disabled)]", - 'not': function(m) { - var e = m[6], p = Selector.patterns, - x = Selector.xpath, le, m, v; - - var exclusion = []; - while (e && le != e && (/\S/).test(e)) { - le = e; - for (var i in p) { - if (m = e.match(p[i])) { - v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); - exclusion.push("(" + v.substring(1, v.length - 1) + ")"); - e = e.replace(m[0], ''); - break; - } - } - } - return "[not(" + exclusion.join(" and ") + ")]"; - }, - 'nth-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); - }, - 'nth-last-child': function(m) { - return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); - }, - 'nth-of-type': function(m) { - return Selector.xpath.pseudos.nth("position() ", m); - }, - 'nth-last-of-type': function(m) { - return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); - }, - 'first-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); - }, - 'last-of-type': function(m) { - m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); - }, - 'only-of-type': function(m) { - var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); - }, - nth: function(fragment, m) { - var mm, formula = m[6], predicate; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - if (mm = formula.match(/^(\d+)$/)) // digit only - return '[' + fragment + "= " + mm[1] + ']'; - if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (mm[1] == "-") mm[1] = -1; - var a = mm[1] ? Number(mm[1]) : 1; - var b = mm[2] ? Number(mm[2]) : 0; - predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + - "((#{fragment} - #{b}) div #{a} >= 0)]"; - return new Template(predicate).evaluate({ - fragment: fragment, a: a, b: b }); - } - } - } - }, - - criteria: { - tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', - className: 'n = h.className(n, r, "#{1}", c); c = false;', - id: 'n = h.id(n, r, "#{1}", c); c = false;', - attrPresence: 'n = h.attrPresence(n, r, "#{1}"); c = false;', - attr: function(m) { - m[3] = (m[5] || m[6]); - return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;').evaluate(m); - }, - pseudo: function(m) { - if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); - return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); - }, - descendant: 'c = "descendant";', - child: 'c = "child";', - adjacent: 'c = "adjacent";', - laterSibling: 'c = "laterSibling";' - }, - - patterns: { - // combinators must be listed first - // (and descendant needs to be last combinator) - laterSibling: /^\s*~\s*/, - child: /^\s*>\s*/, - adjacent: /^\s*\+\s*/, - descendant: /^\s/, - - // selectors follow - tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, - id: /^#([\w\-\*]+)(\b|$)/, - className: /^\.([\w\-\*]+)(\b|$)/, - pseudo: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s)|(?=:))/, - attrPresence: /^\[([\w]+)\]/, - attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ - }, - - // for Selector.match and Element#match - assertions: { - tagName: function(element, matches) { - return matches[1].toUpperCase() == element.tagName.toUpperCase(); - }, - - className: function(element, matches) { - return Element.hasClassName(element, matches[1]); - }, - - id: function(element, matches) { - return element.id === matches[1]; - }, - - attrPresence: function(element, matches) { - return Element.hasAttribute(element, matches[1]); - }, - - attr: function(element, matches) { - var nodeValue = Element.readAttribute(element, matches[1]); - return Selector.operators[matches[2]](nodeValue, matches[3]); - } - }, - - handlers: { - // UTILITY FUNCTIONS - // joins two collections - concat: function(a, b) { - for (var i = 0, node; node = b[i]; i++) - a.push(node); - return a; - }, - - // marks an array of nodes for counting - mark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._counted = true; - return nodes; - }, - - unmark: function(nodes) { - for (var i = 0, node; node = nodes[i]; i++) - node._counted = undefined; - return nodes; - }, - - // mark each child node with its position (for nth calls) - // "ofType" flag indicates whether we're indexing for nth-of-type - // rather than nth-child - index: function(parentNode, reverse, ofType) { - parentNode._counted = true; - if (reverse) { - for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { - var node = nodes[i]; - if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; - } - } else { - for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) - if (node.nodeType == 1 && (!ofType || node._counted)) node.nodeIndex = j++; - } - }, - - // filters out duplicates and extends all nodes - unique: function(nodes) { - if (nodes.length == 0) return nodes; - var results = [], n; - for (var i = 0, l = nodes.length; i < l; i++) - if (!(n = nodes[i])._counted) { - n._counted = true; - results.push(Element.extend(n)); - } - return Selector.handlers.unmark(results); - }, - - // COMBINATOR FUNCTIONS - descendant: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName('*')); - return results; - }, - - child: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) { - for (var j = 0, children = [], child; child = node.childNodes[j]; j++) - if (child.nodeType == 1 && child.tagName != '!') results.push(child); - } - return results; - }, - - adjacent: function(nodes) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - var next = this.nextElementSibling(node); - if (next) results.push(next); - } - return results; - }, - - laterSibling: function(nodes) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - h.concat(results, Element.nextSiblings(node)); - return results; - }, - - nextElementSibling: function(node) { - while (node = node.nextSibling) - if (node.nodeType == 1) return node; - return null; - }, - - previousElementSibling: function(node) { - while (node = node.previousSibling) - if (node.nodeType == 1) return node; - return null; - }, - - // TOKEN FUNCTIONS - tagName: function(nodes, root, tagName, combinator) { - tagName = tagName.toUpperCase(); - var results = [], h = Selector.handlers; - if (nodes) { - if (combinator) { - // fastlane for ordinary descendant combinators - if (combinator == "descendant") { - for (var i = 0, node; node = nodes[i]; i++) - h.concat(results, node.getElementsByTagName(tagName)); - return results; - } else nodes = this[combinator](nodes); - if (tagName == "*") return nodes; - } - for (var i = 0, node; node = nodes[i]; i++) - if (node.tagName.toUpperCase() == tagName) results.push(node); - return results; - } else return root.getElementsByTagName(tagName); - }, - - id: function(nodes, root, id, combinator) { - var targetNode = $(id), h = Selector.handlers; - if (!targetNode) return []; - if (!nodes && root == document) return [targetNode]; - if (nodes) { - if (combinator) { - if (combinator == 'child') { - for (var i = 0, node; node = nodes[i]; i++) - if (targetNode.parentNode == node) return [targetNode]; - } else if (combinator == 'descendant') { - for (var i = 0, node; node = nodes[i]; i++) - if (Element.descendantOf(targetNode, node)) return [targetNode]; - } else if (combinator == 'adjacent') { - for (var i = 0, node; node = nodes[i]; i++) - if (Selector.handlers.previousElementSibling(targetNode) == node) - return [targetNode]; - } else nodes = h[combinator](nodes); - } - for (var i = 0, node; node = nodes[i]; i++) - if (node == targetNode) return [targetNode]; - return []; - } - return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; - }, - - className: function(nodes, root, className, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - return Selector.handlers.byClassName(nodes, root, className); - }, - - byClassName: function(nodes, root, className) { - if (!nodes) nodes = Selector.handlers.descendant([root]); - var needle = ' ' + className + ' '; - for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { - nodeClassName = node.className; - if (nodeClassName.length == 0) continue; - if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) - results.push(node); - } - return results; - }, - - attrPresence: function(nodes, root, attr) { - if (!nodes) nodes = root.getElementsByTagName("*"); - var results = []; - for (var i = 0, node; node = nodes[i]; i++) - if (Element.hasAttribute(node, attr)) results.push(node); - return results; - }, - - attr: function(nodes, root, attr, value, operator) { - if (!nodes) nodes = root.getElementsByTagName("*"); - var handler = Selector.operators[operator], results = []; - for (var i = 0, node; node = nodes[i]; i++) { - var nodeValue = Element.readAttribute(node, attr); - if (nodeValue === null) continue; - if (handler(nodeValue, value)) results.push(node); - } - return results; - }, - - pseudo: function(nodes, name, value, root, combinator) { - if (nodes && combinator) nodes = this[combinator](nodes); - if (!nodes) nodes = root.getElementsByTagName("*"); - return Selector.pseudos[name](nodes, value, root); - } - }, - - pseudos: { - 'first-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.previousElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'last-child': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - if (Selector.handlers.nextElementSibling(node)) continue; - results.push(node); - } - return results; - }, - 'only-child': function(nodes, value, root) { - var h = Selector.handlers; - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) - results.push(node); - return results; - }, - 'nth-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root); - }, - 'nth-last-child': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true); - }, - 'nth-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, false, true); - }, - 'nth-last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, formula, root, true, true); - }, - 'first-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, false, true); - }, - 'last-of-type': function(nodes, formula, root) { - return Selector.pseudos.nth(nodes, "1", root, true, true); - }, - 'only-of-type': function(nodes, formula, root) { - var p = Selector.pseudos; - return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); - }, - - // handles the an+b logic - getIndices: function(a, b, total) { - if (a == 0) return b > 0 ? [b] : []; - return $R(1, total).inject([], function(memo, i) { - if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); - return memo; - }); - }, - - // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type - nth: function(nodes, formula, root, reverse, ofType) { - if (nodes.length == 0) return []; - if (formula == 'even') formula = '2n+0'; - if (formula == 'odd') formula = '2n+1'; - var h = Selector.handlers, results = [], indexed = [], m; - h.mark(nodes); - for (var i = 0, node; node = nodes[i]; i++) { - if (!node.parentNode._counted) { - h.index(node.parentNode, reverse, ofType); - indexed.push(node.parentNode); - } - } - if (formula.match(/^\d+$/)) { // just a number - formula = Number(formula); - for (var i = 0, node; node = nodes[i]; i++) - if (node.nodeIndex == formula) results.push(node); - } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b - if (m[1] == "-") m[1] = -1; - var a = m[1] ? Number(m[1]) : 1; - var b = m[2] ? Number(m[2]) : 0; - var indices = Selector.pseudos.getIndices(a, b, nodes.length); - for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { - for (var j = 0; j < l; j++) - if (node.nodeIndex == indices[j]) results.push(node); - } - } - h.unmark(nodes); - h.unmark(indexed); - return results; - }, - - 'empty': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) { - // IE treats comments as element nodes - if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue; - results.push(node); - } - return results; - }, - - 'not': function(nodes, selector, root) { - var h = Selector.handlers, selectorType, m; - var exclusions = new Selector(selector).findElements(root); - h.mark(exclusions); - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node._counted) results.push(node); - h.unmark(exclusions); - return results; - }, - - 'enabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (!node.disabled) results.push(node); - return results; - }, - - 'disabled': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.disabled) results.push(node); - return results; - }, - - 'checked': function(nodes, value, root) { - for (var i = 0, results = [], node; node = nodes[i]; i++) - if (node.checked) results.push(node); - return results; - } - }, - - operators: { - '=': function(nv, v) { return nv == v; }, - '!=': function(nv, v) { return nv != v; }, - '^=': function(nv, v) { return nv.startsWith(v); }, - '$=': function(nv, v) { return nv.endsWith(v); }, - '*=': function(nv, v) { return nv.include(v); }, - '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, - '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } - }, - - matchElements: function(elements, expression) { - var matches = new Selector(expression).findElements(), h = Selector.handlers; - h.mark(matches); - for (var i = 0, results = [], element; element = elements[i]; i++) - if (element._counted) results.push(element); - h.unmark(matches); - return results; - }, - - findElement: function(elements, expression, index) { - if (Object.isNumber(expression)) { - index = expression; expression = false; - } - return Selector.matchElements(elements, expression || '*')[index || 0]; - }, - - findChildElements: function(element, expressions) { - var exprs = expressions.join(','), expressions = []; - exprs.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { - expressions.push(m[1].strip()); - }); - var results = [], h = Selector.handlers; - for (var i = 0, l = expressions.length, selector; i < l; i++) { - selector = new Selector(expressions[i].strip()); - h.concat(results, selector.findElements(element)); - } - return (l > 1) ? h.unique(results) : results; - } -}); - -function $$() { - return Selector.findChildElements(document, $A(arguments)); -} -var Form = { - reset: function(form) { - $(form).reset(); - return form; - }, - - serializeElements: function(elements, options) { - if (typeof options != 'object') options = { hash: !!options }; - else if (options.hash === undefined) options.hash = true; - var key, value, submitted = false, submit = options.submit; - - var data = elements.inject({ }, function(result, element) { - if (!element.disabled && element.name) { - key = element.name; value = $(element).getValue(); - if (value != null && (element.type != 'submit' || (!submitted && - submit !== false && (!submit || key == submit) && (submitted = true)))) { - if (key in result) { - // a key is already present; construct an array of values - if (!Object.isArray(result[key])) result[key] = [result[key]]; - result[key].push(value); - } - else result[key] = value; - } - } - return result; - }); - - return options.hash ? data : Object.toQueryString(data); - } -}; - -Form.Methods = { - serialize: function(form, options) { - return Form.serializeElements(Form.getElements(form), options); - }, - - getElements: function(form) { - return $A($(form).getElementsByTagName('*')).inject([], - function(elements, child) { - if (Form.Element.Serializers[child.tagName.toLowerCase()]) - elements.push(Element.extend(child)); - return elements; - } - ); - }, - - getInputs: function(form, typeName, name) { - form = $(form); - var inputs = form.getElementsByTagName('input'); - - if (!typeName && !name) return $A(inputs).map(Element.extend); - - for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { - var input = inputs[i]; - if ((typeName && input.type != typeName) || (name && input.name != name)) - continue; - matchingInputs.push(Element.extend(input)); - } - - return matchingInputs; - }, - - disable: function(form) { - form = $(form); - Form.getElements(form).invoke('disable'); - return form; - }, - - enable: function(form) { - form = $(form); - Form.getElements(form).invoke('enable'); - return form; - }, - - findFirstElement: function(form) { - var elements = $(form).getElements().findAll(function(element) { - return 'hidden' != element.type && !element.disabled; - }); - var firstByIndex = elements.findAll(function(element) { - return element.hasAttribute('tabIndex') && element.tabIndex >= 0; - }).sortBy(function(element) { return element.tabIndex }).first(); - - return firstByIndex ? firstByIndex : elements.find(function(element) { - return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); - }); - }, - - focusFirstElement: function(form) { - form = $(form); - form.findFirstElement().activate(); - return form; - }, - - request: function(form, options) { - form = $(form), options = Object.clone(options || { }); - - var params = options.parameters, action = form.readAttribute('action') || ''; - if (action.blank()) action = window.location.href; - options.parameters = form.serialize(true); - - if (params) { - if (Object.isString(params)) params = params.toQueryParams(); - Object.extend(options.parameters, params); - } - - if (form.hasAttribute('method') && !options.method) - options.method = form.method; - - return new Ajax.Request(action, options); - } -}; - -/*--------------------------------------------------------------------------*/ - -Form.Element = { - focus: function(element) { - $(element).focus(); - return element; - }, - - select: function(element) { - $(element).select(); - return element; - } -}; - -Form.Element.Methods = { - serialize: function(element) { - element = $(element); - if (!element.disabled && element.name) { - var value = element.getValue(); - if (value != undefined) { - var pair = { }; - pair[element.name] = value; - return Object.toQueryString(pair); - } - } - return ''; - }, - - getValue: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - return Form.Element.Serializers[method](element); - }, - - setValue: function(element, value) { - element = $(element); - var method = element.tagName.toLowerCase(); - Form.Element.Serializers[method](element, value); - return element; - }, - - clear: function(element) { - $(element).value = ''; - return element; - }, - - present: function(element) { - return $(element).value != ''; - }, - - activate: function(element) { - element = $(element); - try { - element.focus(); - if (element.select && (element.tagName.toLowerCase() != 'input' || - !['button', 'reset', 'submit'].include(element.type))) - element.select(); - } catch (e) { } - return element; - }, - - disable: function(element) { - element = $(element); - element.blur(); - element.disabled = true; - return element; - }, - - enable: function(element) { - element = $(element); - element.disabled = false; - return element; - } -}; - -/*--------------------------------------------------------------------------*/ - -var Field = Form.Element; -var $F = Form.Element.Methods.getValue; - -/*--------------------------------------------------------------------------*/ - -Form.Element.Serializers = { - input: function(element, value) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - return Form.Element.Serializers.inputSelector(element, value); - default: - return Form.Element.Serializers.textarea(element, value); - } - }, - - inputSelector: function(element, value) { - if (value === undefined) return element.checked ? element.value : null; - else element.checked = !!value; - }, - - textarea: function(element, value) { - if (value === undefined) return element.value; - else element.value = value; - }, - - select: function(element, index) { - if (index === undefined) - return this[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - else { - var opt, value, single = !Object.isArray(index); - for (var i = 0, length = element.length; i < length; i++) { - opt = element.options[i]; - value = this.optionValue(opt); - if (single) { - if (value == index) { - opt.selected = true; - return; - } - } - else opt.selected = index.include(value); - } - } - }, - - selectOne: function(element) { - var index = element.selectedIndex; - return index >= 0 ? this.optionValue(element.options[index]) : null; - }, - - selectMany: function(element) { - var values, length = element.length; - if (!length) return null; - - for (var i = 0, values = []; i < length; i++) { - var opt = element.options[i]; - if (opt.selected) values.push(this.optionValue(opt)); - } - return values; - }, - - optionValue: function(opt) { - // extend element because hasAttribute may not be native - return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; - } -}; - -/*--------------------------------------------------------------------------*/ - -Abstract.TimedObserver = Class.create(PeriodicalExecuter, { - initialize: function($super, element, frequency, callback) { - $super(callback, frequency); - this.element = $(element); - this.lastValue = this.getValue(); - }, - - execute: function() { - var value = this.getValue(); - if (Object.isString(this.lastValue) && Object.isString(value) ? - this.lastValue != value : String(this.lastValue) != String(value)) { - this.callback(this.element, value); - this.lastValue = value; - } - } -}); - -Form.Element.Observer = Class.create(Abstract.TimedObserver, { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(Abstract.TimedObserver, { - getValue: function() { - return Form.serialize(this.element); - } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = Class.create({ - initialize: function(element, callback) { - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - if (this.element.tagName.toLowerCase() == 'form') - this.registerFormCallbacks(); - else - this.registerCallback(this.element); - }, - - onElementEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - }, - - registerFormCallbacks: function() { - Form.getElements(this.element).each(this.registerCallback, this); - }, - - registerCallback: function(element) { - if (element.type) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - Event.observe(element, 'click', this.onElementEvent.bind(this)); - break; - default: - Event.observe(element, 'change', this.onElementEvent.bind(this)); - break; - } - } - } -}); - -Form.Element.EventObserver = Class.create(Abstract.EventObserver, { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.EventObserver = Class.create(Abstract.EventObserver, { - getValue: function() { - return Form.serialize(this.element); - } -}); -if (!window.Event) var Event = { }; - -Object.extend(Event, { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - KEY_HOME: 36, - KEY_END: 35, - KEY_PAGEUP: 33, - KEY_PAGEDOWN: 34, - KEY_INSERT: 45, - - cache: { }, - - relatedTarget: function(event) { - var element; - switch(event.type) { - case 'mouseover': element = event.fromElement; break; - case 'mouseout': element = event.toElement; break; - default: return null; - } - return Element.extend(element); - } -}); - -Event.Methods = (function() { - var isButton; - - if (Prototype.Browser.IE) { - var buttonMap = { 0: 1, 1: 4, 2: 2 }; - isButton = function(event, code) { - return event.button == buttonMap[code]; - }; - - } else if (Prototype.Browser.WebKit) { - isButton = function(event, code) { - switch (code) { - case 0: return event.which == 1 && !event.metaKey; - case 1: return event.which == 1 && event.metaKey; - default: return false; - } - }; - - } else { - isButton = function(event, code) { - return event.which ? (event.which === code + 1) : (event.button === code); - }; - } - - return { - isLeftClick: function(event) { return isButton(event, 0) }, - isMiddleClick: function(event) { return isButton(event, 1) }, - isRightClick: function(event) { return isButton(event, 2) }, - - element: function(event) { - var node = Event.extend(event).target; - return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node); - }, - - findElement: function(event, expression) { - var element = Event.element(event); - return element.match(expression) ? element : element.up(expression); - }, - - pointer: function(event) { - return { - x: event.pageX || (event.clientX + - (document.documentElement.scrollLeft || document.body.scrollLeft)), - y: event.pageY || (event.clientY + - (document.documentElement.scrollTop || document.body.scrollTop)) - }; - }, - - pointerX: function(event) { return Event.pointer(event).x }, - pointerY: function(event) { return Event.pointer(event).y }, - - stop: function(event) { - Event.extend(event); - event.preventDefault(); - event.stopPropagation(); - event.stopped = true; - } - }; -})(); - -Event.extend = (function() { - var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { - m[name] = Event.Methods[name].methodize(); - return m; - }); - - if (Prototype.Browser.IE) { - Object.extend(methods, { - stopPropagation: function() { this.cancelBubble = true }, - preventDefault: function() { this.returnValue = false }, - inspect: function() { return "[object Event]" } - }); - - return function(event) { - if (!event) return false; - if (event._extendedByPrototype) return event; - - event._extendedByPrototype = Prototype.emptyFunction; - var pointer = Event.pointer(event); - Object.extend(event, { - target: event.srcElement, - relatedTarget: Event.relatedTarget(event), - pageX: pointer.x, - pageY: pointer.y - }); - return Object.extend(event, methods); - }; - - } else { - Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__; - Object.extend(Event.prototype, methods); - return Prototype.K; - } -})(); - -Object.extend(Event, (function() { - var cache = Event.cache; - - function getEventID(element) { - if (element._eventID) return element._eventID; - arguments.callee.id = arguments.callee.id || 1; - return element._eventID = ++arguments.callee.id; - } - - function getDOMEventName(eventName) { - if (eventName && eventName.include(':')) return "dataavailable"; - return eventName; - } - - function getCacheForID(id) { - return cache[id] = cache[id] || { }; - } - - function getWrappersForEventName(id, eventName) { - var c = getCacheForID(id); - return c[eventName] = c[eventName] || []; - } - - function createWrapper(element, eventName, handler) { - var id = getEventID(element); - var c = getWrappersForEventName(id, eventName); - if (c.pluck("handler").include(handler)) return false; - - var wrapper = function(event) { - if (!Event || !Event.extend || - (event.eventName && event.eventName != eventName)) - return false; - - Event.extend(event); - handler.call(element, event) - }; - - wrapper.handler = handler; - c.push(wrapper); - return wrapper; - } - - function findWrapper(id, eventName, handler) { - var c = getWrappersForEventName(id, eventName); - return c.find(function(wrapper) { return wrapper.handler == handler }); - } - - function destroyWrapper(id, eventName, handler) { - var c = getCacheForID(id); - if (!c[eventName]) return false; - c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); - } - - function destroyCache() { - for (var id in cache) - for (var eventName in cache[id]) - cache[id][eventName] = null; - } - - if (window.attachEvent) { - window.attachEvent("onunload", destroyCache); - } - - return { - observe: function(element, eventName, handler) { - element = $(element); - var name = getDOMEventName(eventName); - - var wrapper = createWrapper(element, eventName, handler); - if (!wrapper) return element; - - if (element.addEventListener) { - element.addEventListener(name, wrapper, false); - } else { - element.attachEvent("on" + name, wrapper); - } - - return element; - }, - - stopObserving: function(element, eventName, handler) { - element = $(element); - var id = getEventID(element), name = getDOMEventName(eventName); - - if (!handler && eventName) { - getWrappersForEventName(id, eventName).each(function(wrapper) { - element.stopObserving(eventName, wrapper.handler); - }); - return element; - - } else if (!eventName) { - Object.keys(getCacheForID(id)).each(function(eventName) { - element.stopObserving(eventName); - }); - return element; - } - - var wrapper = findWrapper(id, eventName, handler); - if (!wrapper) return element; - - if (element.removeEventListener) { - element.removeEventListener(name, wrapper, false); - } else { - element.detachEvent("on" + name, wrapper); - } - - destroyWrapper(id, eventName, handler); - - return element; - }, - - fire: function(element, eventName, memo) { - element = $(element); - if (element == document && document.createEvent && !element.dispatchEvent) - element = document.documentElement; - - if (document.createEvent) { - var event = document.createEvent("HTMLEvents"); - event.initEvent("dataavailable", true, true); - } else { - var event = document.createEventObject(); - event.eventType = "ondataavailable"; - } - - event.eventName = eventName; - event.memo = memo || { }; - - if (document.createEvent) { - element.dispatchEvent(event); - } else { - element.fireEvent(event.eventType, event); - } - - return event; - } - }; -})()); - -Object.extend(Event, Event.Methods); - -Element.addMethods({ - fire: Event.fire, - observe: Event.observe, - stopObserving: Event.stopObserving -}); - -Object.extend(document, { - fire: Element.Methods.fire.methodize(), - observe: Element.Methods.observe.methodize(), - stopObserving: Element.Methods.stopObserving.methodize() -}); - -(function() { - /* Support for the DOMContentLoaded event is based on work by Dan Webb, - Matthias Miller, Dean Edwards and John Resig. */ - - var timer, fired = false; - - function fireContentLoadedEvent() { - if (fired) return; - if (timer) window.clearInterval(timer); - document.fire("dom:loaded"); - fired = true; - } - - if (document.addEventListener) { - if (Prototype.Browser.WebKit) { - timer = window.setInterval(function() { - if (/loaded|complete/.test(document.readyState)) - fireContentLoadedEvent(); - }, 0); - - Event.observe(window, "load", fireContentLoadedEvent); - - } else { - document.addEventListener("DOMContentLoaded", - fireContentLoadedEvent, false); - } - - } else { - document.write(" - - - - - - - - - - -
- - - - - - - - \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/js_test/unittest.js b/timcharper-calendar_date_select-d3b2b8c/js_test/unittest.js deleted file mode 100755 index c0930c2..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/js_test/unittest.js +++ /dev/null @@ -1,564 +0,0 @@ -// script.aculo.us unittest.js v1.7.0, Fri Jan 19 19:16:36 CET 2007 - -// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com) -// (c) 2005, 2006 Michael Schuerig (http://www.schuerig.de/michael/) -// -// script.aculo.us is freely distributable under the terms of an MIT-style license. -// For details, see the script.aculo.us web site: http://script.aculo.us/ - -// experimental, Firefox-only -Event.simulateMouse = function(element, eventName) { - var options = Object.extend({ - pointerX: 0, - pointerY: 0, - buttons: 0, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false - }, arguments[2] || {}); - var oEvent = document.createEvent("MouseEvents"); - oEvent.initMouseEvent(eventName, true, true, document.defaultView, - options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element)); - - if(this.mark) Element.remove(this.mark); - this.mark = document.createElement('div'); - this.mark.appendChild(document.createTextNode(" ")); - document.body.appendChild(this.mark); - this.mark.style.position = 'absolute'; - this.mark.style.top = options.pointerY + "px"; - this.mark.style.left = options.pointerX + "px"; - this.mark.style.width = "5px"; - this.mark.style.height = "5px;"; - this.mark.style.borderTop = "1px solid red;" - this.mark.style.borderLeft = "1px solid red;" - - if(this.step) - alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options)); - - $(element).dispatchEvent(oEvent); -}; - -// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2. -// You need to downgrade to 1.0.4 for now to get this working -// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much -Event.simulateKey = function(element, eventName) { - var options = Object.extend({ - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: 0, - charCode: 0 - }, arguments[2] || {}); - - var oEvent = document.createEvent("KeyEvents"); - oEvent.initKeyEvent(eventName, true, true, window, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, - options.keyCode, options.charCode ); - $(element).dispatchEvent(oEvent); -}; - -Event.simulateKeys = function(element, command) { - for(var i=0; i' + - '' + - '' + - '' + - '
StatusTestMessage
'; - this.logsummary = $('logsummary') - this.loglines = $('loglines'); - }, - _toHTML: function(txt) { - return txt.escapeHTML().replace(/\n/g,"
"); - }, - addLinksToResults: function(){ - $$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log - td.title = "Run only this test" - Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;}); - }); - $$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log - td.title = "Run all tests" - Event.observe(td, 'click', function(){ window.location.search = "";}); - }); - } -} - -Test.Unit.Runner = Class.create(); -Test.Unit.Runner.prototype = { - initialize: function(testcases) { - this.options = Object.extend({ - testLog: 'testlog' - }, arguments[1] || {}); - this.options.resultsURL = this.parseResultsURLQueryParameter(); - this.options.tests = this.parseTestsQueryParameter(); - if (this.options.testLog) { - this.options.testLog = $(this.options.testLog) || null; - } - if(this.options.tests) { - this.tests = []; - for(var i = 0; i < this.options.tests.length; i++) { - if(/^test/.test(this.options.tests[i])) { - this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"])); - } - } - } else { - if (this.options.test) { - this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])]; - } else { - this.tests = []; - for(var testcase in testcases) { - if(/^test/.test(testcase)) { - this.tests.push( - new Test.Unit.Testcase( - this.options.context ? ' -> ' + this.options.titles[testcase] : testcase, - testcases[testcase], testcases["setup"], testcases["teardown"] - )); - } - } - } - } - this.currentTest = 0; - this.logger = new Test.Unit.Logger(this.options.testLog); - setTimeout(this.runTests.bind(this), 1000); - }, - parseResultsURLQueryParameter: function() { - return window.location.search.parseQuery()["resultsURL"]; - }, - parseTestsQueryParameter: function(){ - if (window.location.search.parseQuery()["tests"]){ - return window.location.search.parseQuery()["tests"].split(','); - }; - }, - // Returns: - // "ERROR" if there was an error, - // "FAILURE" if there was a failure, or - // "SUCCESS" if there was neither - getResult: function() { - var hasFailure = false; - for(var i=0;i 0) { - return "ERROR"; - } - if (this.tests[i].failures > 0) { - hasFailure = true; - } - } - if (hasFailure) { - return "FAILURE"; - } else { - return "SUCCESS"; - } - }, - postResults: function() { - if (this.options.resultsURL) { - new Ajax.Request(this.options.resultsURL, - { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false }); - } - }, - runTests: function() { - var test = this.tests[this.currentTest]; - if (!test) { - // finished! - this.postResults(); - this.logger.summary(this.summary()); - return; - } - if(!test.isWaiting) { - this.logger.start(test.name); - } - test.run(); - if(test.isWaiting) { - this.logger.message("Waiting for " + test.timeToWait + "ms"); - setTimeout(this.runTests.bind(this), test.timeToWait || 1000); - } else { - this.logger.finish(test.status(), test.summary()); - this.currentTest++; - // tail recursive, hopefully the browser will skip the stackframe - this.runTests(); - } - }, - summary: function() { - var assertions = 0; - var failures = 0; - var errors = 0; - var messages = []; - for(var i=0;i 0) return 'failed'; - if (this.errors > 0) return 'error'; - return 'passed'; - }, - assert: function(expression, message) { - var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"' + (message||""); - try { expression ? this.pass() : - this.fail(message); } - catch(e) { this.error(e); } - }, - assertEqual: function(expected, actual, message) { - var message = arguments[2] || "assertEqual"; - try { (expected == actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"' + (message||"")); } - catch(e) { this.error(e); } - }, - assertInspect: function(expected, actual) { - var message = arguments[2] || "assertInspect"; - try { (expected == actual.inspect()) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertEnumEqual: function(expected, actual) { - var message = arguments[2] || "assertEnumEqual"; - try { $A(expected).length == $A(actual).length && - expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ? - this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) + - ', actual ' + Test.Unit.inspect(actual)); } - catch(e) { this.error(e); } - }, - assertNotEqual: function(expected, actual, message) { - var message = arguments[2] || "assertNotEqual"; - try { (expected != actual) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"' + (message||"")); } - catch(e) { this.error(e); } - }, - assertIdentical: function(expected, actual, message) { - var message = arguments[2] || "assertIdentical"; - try { (expected === actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"' + (message||"")); } - catch(e) { this.error(e); } - }, - assertNotIdentical: function(expected, actual,message) { - var message = arguments[2] || "assertNotIdentical"; - try { !(expected === actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"' + (message||"")); } - catch(e) { this.error(e); } - }, - assertNull: function(obj, message) { - var message = arguments[1] || 'assertNull' - try { (obj==null) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"' + (message||"")); } - catch(e) { this.error(e); } - }, - assertMatch: function(expected, actual, message) { - var message = arguments[2] || 'assertMatch'; - var regex = new RegExp(expected); - try { (regex.exec(actual)) ? this.pass() : - this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"' + (message||"")); } - catch(e) { this.error(e); } - }, - assertHidden: function(element) { - var message = arguments[1] || 'assertHidden'; - this.assertEqual("none", element.style.display, message); - }, - assertNotNull: function(object) { - var message = arguments[1] || 'assertNotNull'; - this.assert(object != null, message); - }, - assertType: function(expected, actual) { - var message = arguments[2] || 'assertType'; - try { - (actual.constructor == expected) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + (actual.constructor) + '"'); } - catch(e) { this.error(e); } - }, - assertNotOfType: function(expected, actual) { - var message = arguments[2] || 'assertNotOfType'; - try { - (actual.constructor != expected) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + (actual.constructor) + '"'); } - catch(e) { this.error(e); } - }, - assertInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertInstanceOf'; - try { - (actual instanceof expected) ? this.pass() : - this.fail(message + ": object was not an instance of the expected type"); } - catch(e) { this.error(e); } - }, - assertNotInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertNotInstanceOf'; - try { - !(actual instanceof expected) ? this.pass() : - this.fail(message + ": object was an instance of the not expected type"); } - catch(e) { this.error(e); } - }, - assertRespondsTo: function(method, obj) { - var message = arguments[2] || 'assertRespondsTo'; - try { - (obj[method] && typeof obj[method] == 'function') ? this.pass() : - this.fail(message + ": object doesn't respond to [" + method + "]"); } - catch(e) { this.error(e); } - }, - assertReturnsTrue: function(method, obj) { - var message = arguments[2] || 'assertReturnsTrue'; - try { - var m = obj[method]; - if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; - m() ? this.pass() : - this.fail(message + ": method returned false"); } - catch(e) { this.error(e); } - }, - assertReturnsFalse: function(method, obj) { - var message = arguments[2] || 'assertReturnsFalse'; - try { - var m = obj[method]; - if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)]; - !m() ? this.pass() : - this.fail(message + ": method returned true"); } - catch(e) { this.error(e); } - }, - assertRaise: function(exceptionName, method) { - var message = arguments[2] || 'assertRaise'; - try { - method(); - this.fail(message + ": exception expected but none was raised"); } - catch(e) { - ((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e); - } - }, - assertElementsMatch: function() { - var expressions = $A(arguments), elements = $A(expressions.shift()); - if (elements.length != expressions.length) { - this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions'); - return false; - } - elements.zip(expressions).all(function(pair, index) { - var element = $(pair.first()), expression = pair.last(); - if (element.match(expression)) return true; - this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect()); - }.bind(this)) && this.pass(); - }, - assertElementMatches: function(element, expression) { - this.assertElementsMatch([element], expression); - }, - benchmark: function(operation, iterations) { - var startAt = new Date(); - (iterations || 1).times(operation); - var timeTaken = ((new Date())-startAt); - this.info((arguments[2] || 'Operation') + ' finished ' + - iterations + ' iterations in ' + (timeTaken/1000)+'s' ); - return timeTaken; - }, - _isVisible: function(element) { - element = $(element); - if(!element.parentNode) return true; - this.assertNotNull(element); - if(element.style && Element.getStyle(element, 'display') == 'none') - return false; - - return this._isVisible(element.parentNode); - }, - assertNotVisible: function(element) { - this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1])); - }, - assertVisible: function(element) { - this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1])); - }, - benchmark: function(operation, iterations) { - var startAt = new Date(); - (iterations || 1).times(operation); - var timeTaken = ((new Date())-startAt); - this.info((arguments[2] || 'Operation') + ' finished ' + - iterations + ' iterations in ' + (timeTaken/1000)+'s' ); - return timeTaken; - } -} - -Test.Unit.Testcase = Class.create(); -Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), { - initialize: function(name, test, setup, teardown) { - Test.Unit.Assertions.prototype.initialize.bind(this)(); - this.name = name; - - if(typeof test == 'string') { - test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,'); - test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)'); - this.test = function() { - eval('with(this){'+test+'}'); - } - } else { - this.test = test || function() {}; - } - - this.setup = setup || function() {}; - this.teardown = teardown || function() {}; - this.isWaiting = false; - this.timeToWait = 1000; - }, - wait: function(time, nextPart) { - this.isWaiting = true; - this.test = nextPart; - this.timeToWait = time; - }, - run: function() { - try { - try { - if (!this.isWaiting) this.setup.bind(this)(); - this.isWaiting = false; - this.test.bind(this)(); - } finally { - if(!this.isWaiting) { - this.teardown.bind(this)(); - } - } - } - catch(e) { this.error(e); } - } -}); - -// *EXPERIMENTAL* BDD-style testing to please non-technical folk -// This draws many ideas from RSpec http://rspec.rubyforge.org/ - -Test.setupBDDExtensionMethods = function(){ - var METHODMAP = { - shouldEqual: 'assertEqual', - shouldNotEqual: 'assertNotEqual', - shouldEqualEnum: 'assertEnumEqual', - shouldBeA: 'assertType', - shouldNotBeA: 'assertNotOfType', - shouldBeAn: 'assertType', - shouldNotBeAn: 'assertNotOfType', - shouldBeNull: 'assertNull', - shouldNotBeNull: 'assertNotNull', - - shouldBe: 'assertReturnsTrue', - shouldNotBe: 'assertReturnsFalse', - shouldRespondTo: 'assertRespondsTo' - }; - Test.BDDMethods = {}; - for(m in METHODMAP) { - Test.BDDMethods[m] = eval( - 'function(){'+ - 'var args = $A(arguments);'+ - 'var scope = args.shift();'+ - 'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }'); - } - [Array.prototype, String.prototype, Number.prototype].each( - function(p){ Object.extend(p, Test.BDDMethods) } - ); -} - -Test.context = function(name, spec, log){ - Test.setupBDDExtensionMethods(); - - var compiledSpec = {}; - var titles = {}; - for(specName in spec) { - switch(specName){ - case "setup": - case "teardown": - compiledSpec[specName] = spec[specName]; - break; - default: - var testName = 'test'+specName.gsub(/\s+/,'-').camelize(); - var body = spec[specName].toString().split('\n').slice(1); - if(/^\{/.test(body[0])) body = body.slice(1); - body.pop(); - body = body.map(function(statement){ - return statement.strip() - }); - compiledSpec[testName] = body.join('\n'); - titles[testName] = specName; - } - } - new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name }); -}; \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select.rb b/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select.rb deleted file mode 100755 index 17e207f..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select.rb +++ /dev/null @@ -1,33 +0,0 @@ -require "calendar_date_select/calendar_date_select.rb" -require "calendar_date_select/form_helpers.rb" -require "calendar_date_select/includes_helper.rb" - -if Object.const_defined?(:Rails) && File.directory?(Rails.root.to_s + "/public") - ActionView::Helpers::FormHelper.send(:include, CalendarDateSelect::FormHelpers) - ActionView::Base.send(:include, CalendarDateSelect::FormHelpers) - ActionView::Base.send(:include, CalendarDateSelect::IncludesHelper) - - # Filthy backwards compatibility hooks... grumble - if ([Rails::VERSION::MAJOR, Rails::VERSION::MINOR] <=> [2, 2]) == -1 - ActionView::Helpers::InstanceTag.class_eval do - def self.new_with_backwards_compatibility(object_name, method_name, template_object, object = nil) - new(object_name, method_name, template_object, nil, object) - end - end - - else - ActionView::Helpers::InstanceTag.class_eval do - class << self; alias new_with_backwards_compatibility new; end - end - end - - # install files - unless File.exists?(RAILS_ROOT + '/public/javascripts/calendar_date_select/calendar_date_select.js') - ['/public', '/public/javascripts/calendar_date_select', '/public/stylesheets/calendar_date_select', '/public/images/calendar_date_select', '/public/javascripts/calendar_date_select/locale'].each do |dir| - source = File.dirname(__FILE__) + "/../#{dir}" - dest = RAILS_ROOT + dir - FileUtils.mkdir_p(dest) - FileUtils.cp(Dir.glob(source+'/*.*'), dest) - end - end -end \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select/calendar_date_select.rb b/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select/calendar_date_select.rb deleted file mode 100755 index b3b77cb..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select/calendar_date_select.rb +++ /dev/null @@ -1,122 +0,0 @@ -module CalendarDateSelect - VERSION = '1.16.1' - - FORMATS = { - :natural => { - :date => "%B %d, %Y", - :time => " %I:%M %p" - }, - :hyphen_ampm => { - :date => "%Y-%m-%d", - :time => " %I:%M %p", - :javascript_include => "format_hyphen_ampm" - }, - :iso_date => { - :date => "%Y-%m-%d", - :time => " %H:%M", - :javascript_include => "format_iso_date" - }, - :finnish => { - :date => "%d.%m.%Y", - :time => " %H:%M", - :javascript_include => "format_finnish" - }, - :danish => { - :date => "%d/%m/%Y", - :time => " %H:%M", - :javascript_include => "format_danish" - }, - :american => { - :date => "%m/%d/%Y", - :time => " %I:%M %p", - :javascript_include => "format_american" - }, - :euro_24hr => { - :date => "%d %B %Y", - :time => " %H:%M", - :javascript_include => "format_euro_24hr" - }, - :euro_24hr_ymd => { - :date => "%Y.%m.%d", - :time => " %H:%M", - :javascript_include => "format_euro_24hr_ymd" - }, - :italian => { - :date => "%d/%m/%Y", - :time => " %H:%M", - :javascript_include => "format_italian" - }, - :db => { - :date => "%Y-%m-%d", - :time => " %H:%M", - :javascript_include => "format_db" - } - } - - # Returns the default_options hash. These options are by default provided to every calendar_date_select control, unless otherwise overrided. - # - # Example: - # # At the bottom of config/environment.rb: - # CalendarDateSelect.default_options.update( - # :popup => "force", - # :month_year => "label", - # :image => "custom_calendar_picker.png" - # ) - def self.default_options - @calendar_date_select_default_options ||= { :image => "calendar_date_select/calendar.gif" } - end - - # Set the picker image. Provide the image url the same way you would provide it to image_tag - def self.image=(value) - default_options[:image] = value - end - - # Returns the options for the given format - # - # Example: - # CalendarDateSelect.format = :italian - # puts CalendarDateSelect.format[:date] - # => "%d/%m/%Y" - def self.format - @calendar_date_select_format ||= FORMATS[:natural] - end - - # Set the format. To see a list of available formats, CalendarDateSelect::FORMATS.keys, or open lib/calendar_date_select/calendar_date_select.rb - # - # (e.g. CalendarDateSelect.format = :italian) - def self.format=(format) - raise "CalendarDateSelect: Unrecognized format specification: #{format}" unless FORMATS.has_key?(format) - @calendar_date_select_format = FORMATS[format] - end - - def self.date_format_string(time = false) - format[:date] + (time ? format[:time] : "") - end - - def self.format_date(date) - if date.is_a?(Date) - date.strftime(date_format_string(false)) - else - date.strftime(date_format_string(true)) - end - end - - def self.format_time(value, options = {}) - return value unless value.respond_to?("strftime") - if options[:time] - format_date(value) - else - format_date(value.to_date) - end - end - - # Detects the presence of time in a date, string - def self.has_time?(value) - case value - when DateTime, Time then true - when Date then false - else - /[0-9]:[0-9]{2}/.match(value.to_s) ? true : false - end - end -end diff --git a/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select/form_helpers.rb b/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select/form_helpers.rb deleted file mode 100755 index 4b6f995..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select/form_helpers.rb +++ /dev/null @@ -1,237 +0,0 @@ -# Various helpers available for use in your view -module CalendarDateSelect::FormHelpers - - # Similar to text_field_tag, but adds a calendar picker, naturally. - # - # == Arguments - # - # +name+ - the html name of the tag - # +value+ - When specified as a string, uses value verbatim. When Date, DateTime, Time, it converts it to a string basd off the format set by CalendarDateSelect#format= - # +options+ - ... - # - # == Options - # - # === :embedded - # - # Put the calendar straight into the form, rather than using a popup type of form. - # - # <%= calendar_date_select_tag "name", "2007-01-01", :embedded => true %> - # - # === :hidden - # - # Use a hidden element instead of a text box for a pop up calendar. Not compatible with :embedded => true. You'll probably want to use an onchange callback to do something with the value. - # - # - # <%= calendar_date_select_tag "hidden_date_selector", "", :hidden => "true", :onchange => "$('cds_value').update($F(this));" %> - # - # === :image - # - # Specify an alternative icon to use for the date picker. - # - # To use /images/groovy.png: - # - # <%= calendar_date_select_tag "altered_image", "", :image => "groovy.png" %> - # - # === :minute_interval - # - # Specifies the minute interval used in the hour/minute selector. Default is 5. - # - # <%= calendar_date_select_tag "month_year_selector_label", "", :minute_interval => 15 %> - # - # === :month_year - # - # Customize the month and year selectors at the top of the control. - # - # Valid values: - # * "dropdowns" (default) - Use a separate dropdown control for both the month and year - # * "label" - Use static text to show the month and the year. - # - # <%= calendar_date_select_tag "month_year_selector_label", "", :month_year => "label" %> - # - # === :popup => 'force' - # - # Forces the user to use the popup calendar by making it's text-box read-only and causing calendar_date_select to override it's default behavior of not allowing selection of a date on a target element that is read-only. - # - # <%= calendar_date_select_tag "name", "2007-01-01", :popup => "force" %> - # - # === :time - # - # Show time in the controls. There's three options: - # - # * +true+ - show an hour/minute selector. - # * +false+ - don't show an hour/minute selector. - # * +"mixed"+ - Show an hour/minute selector, but include a "all day" option - allowing them to choose whether or not to specify a time. - # - # === :year_range - # - # Limit the year range. You can pass in an array or range of ruby Date/Time objects or FixNum's. - # - # <%= calendar_date_select_tag "e_date", nil, :year_range => 10.years.ago..0.years.from_now %> - # <%= calendar_date_select_tag "e_date", nil, :year_range => [0.years.ago, 10.years.from_now] %> - # <%= calendar_date_select_tag "e_date", nil, :year_range => 2000..2007 %> - # <%= calendar_date_select_tag "e_date", nil, :year_range => [2000, 2007] %> - # - # == CALLBACKS - # - # The following callbacks are available: - # - # * before_show / after_show - # * before_close / after_close - # * after_navigate - Called when navigating to a different month. Passes first parameter as a date object refering to the current month viewed - # * onchange - Called when the form input value changes - # - # <%= calendar_date_select_tag "event_demo", "", - # :before_show => "log('Calendar Showing');" , - # :after_show => "log('Calendar Shown');" , - # :before_close => "log('Calendar closing');" , - # :after_close => "log('Calendar closed');", - # :after_navigate => "log('Current month is ' + (param.getMonth()+1) + '/' + (param.getFullYear()));", - # :onchange => "log('value changed to - ' + $F(this));" %> - # - # }}} - # - # All callbacks are executed within the context of the target input element. If you'd like to access the CalendarDateSelect object itself, you can access it via "this.calendar_date_select". - # - # For example: - # - # <%= calendar_date_select_tag "event_demo", "", :after_navigate => "alert('The current selected month is ' + this.calendar_date_select.selected_date.getMonth());" , - def calendar_date_select_tag( name, value = nil, options = {}) - image, options, javascript_options = calendar_date_select_process_options(options) - value = CalendarDateSelect.format_time(value, javascript_options) - - javascript_options.delete(:format) - - options[:id] ||= name - tag = javascript_options[:hidden] || javascript_options[:embedded] ? - hidden_field_tag(name, value, options) : - text_field_tag(name, value, options) - - calendar_date_select_output(tag, image, options, javascript_options) - end - - # Similar to the difference between +text_field_tag+ and +text_field+, this method behaves like +text_field+ - # - # It receives the same options as +calendar_date_select_tag+. Need for time selection is automatically detected by checking the corresponding column meta information of Model#columns_hash - def calendar_date_select(object, method, options={}) - obj = options[:object] || instance_variable_get("@#{object}") - - if !options.include?(:time) && obj.class.respond_to?("columns_hash") - column_type = obj.class.columns_hash[method.to_s].type if obj.class.columns_hash.include?(method.to_s) - options[:time] = true if column_type == :datetime - end - - use_time = options[:time] - - if options[:time].to_s=="mixed" - use_time = false if Date===(obj.respond_to?(method) && obj.send(method)) - end - - image, options, javascript_options = calendar_date_select_process_options(options) - - options[:value] ||= - if(obj.respond_to?(method) && obj.send(method).respond_to?(:strftime)) - obj.send(method).strftime(CalendarDateSelect.date_format_string(use_time)) - elsif obj.respond_to?("#{method}_before_type_cast") - obj.send("#{method}_before_type_cast") - elsif obj.respond_to?(method) - obj.send(method).to_s - else - begin - obj.send(method).strftime(CalendarDateSelect.date_format_string(use_time)) - rescue - nil - end - end - - tag = ActionView::Helpers::InstanceTag.new_with_backwards_compatibility(object, method, self, options.delete(:object)) - calendar_date_select_output( - tag.to_input_field_tag( (javascript_options[:hidden] || javascript_options[:embedded]) ? "hidden" : "text", options), - image, - options, - javascript_options - ) - end - - private - # extracts any options passed into calendar date select, appropriating them to either the Javascript call or the html tag. - def calendar_date_select_process_options(options) - options, javascript_options = CalendarDateSelect.default_options.merge(options), {} - image = options.delete(:image) - callbacks = [:before_show, :before_close, :after_show, :after_close, :after_navigate] - for key in [:default_time, :time, :valid_date_check, :embedded, :buttons, :clear_button, :format, :year_range, :month_year, :popup, :hidden, :minute_interval] + callbacks - javascript_options[key] = options.delete(key) if options.has_key?(key) - end - - if (default_time = javascript_options[:default_time]) - if default_time.respond_to?(:strftime) - javascript_options[:default_time] = "new Date('#{default_time.strftime(CalendarDateSelect.date_format_string(true))}')" - else - javascript_options[:default_time] = "function() { return #{default_time} }" - end - end - - # if passing in mixed, pad it with single quotes - javascript_options[:time] = "'mixed'" if javascript_options[:time].to_s=="mixed" - javascript_options[:month_year] = "'#{javascript_options[:month_year]}'" if javascript_options[:month_year] - - # if we are forcing the popup, automatically set the readonly property on the input control. - if javascript_options[:popup].to_s == "force" - javascript_options[:popup] = "'force'" - options[:readonly] = true - end - - if (vdc=javascript_options.delete(:valid_date_check)) - if vdc.include?(";") || vdc.include?("function") - raise ArgumentError, ":valid_date_check function is missing a 'return' statement. Try something like: :valid_date_check => 'if (date > new(Date)) return true; else return false;'" unless vdc.include?("return"); - end - - vdc = "return(#{vdc})" unless vdc.include?("return") - vdc = "function(date) { #{vdc} }" unless vdc.include?("function") - javascript_options[:valid_date_check] = vdc - end - - javascript_options[:popup_by] ||= "this" if javascript_options[:hidden] - - # surround any callbacks with a function, if not already done so - for key in callbacks - javascript_options[key] = "function(param) { #{javascript_options[key]} }" unless javascript_options[key].include?("function") if javascript_options[key] - end - - javascript_options[:year_range] = format_year_range(javascript_options[:year_range] || 10) - [image, options, javascript_options] - end - - def calendar_date_select_output(input, image, options = {}, javascript_options = {}) - out = input - if javascript_options[:embedded] - uniq_id = "cds_placeholder_#{(rand*100000).to_i}" - # we need to be able to locate the target input element, so lets stick an invisible span tag here we can easily locate - out << content_tag(:span, nil, :style => "display: none; position: absolute;", :id => uniq_id) - out << javascript_tag("new CalendarDateSelect( $('#{uniq_id}').previous(), #{options_for_javascript(javascript_options)} ); ") - else - out << " " - out << image_tag(image, - :onclick => "new CalendarDateSelect( $(this).previous(), #{options_for_javascript(javascript_options)} );", - :style => 'border:0px; cursor:pointer;', - :class=>'calendar_date_select_popup_icon') - end - out - end - - def format_year_range(year) # nodoc - return year unless year.respond_to?(:first) - return "[#{year.first}, #{year.last}]" unless year.first.respond_to?(:strftime) - return "[#{year.first.year}, #{year.last.year}]" - end -end - -# Helper method for form builders -module ActionView - module Helpers - class FormBuilder - def calendar_date_select(method, options = {}) - @template.calendar_date_select(@object_name, method, options.merge(:object => @object)) - end - end - end -end diff --git a/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select/includes_helper.rb b/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select/includes_helper.rb deleted file mode 100755 index ece83ba..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/lib/calendar_date_select/includes_helper.rb +++ /dev/null @@ -1,29 +0,0 @@ -module CalendarDateSelect::IncludesHelper - # returns the selected calendar_date_select stylesheet (not an array) - def calendar_date_select_stylesheets(options = {}) - options.assert_valid_keys(:style) - "calendar_date_select/#{options[:style] || "default"}" - end - - # returns an array of javascripts needed for the selected locale, date_format, and calendar control itself. - def calendar_date_select_javascripts(options = {}) - options.assert_valid_keys(:locale) - files = ["calendar_date_select/calendar_date_select"] - files << "calendar_date_select/locale/#{options[:locale]}" if options[:locale] - files << "calendar_date_select/#{CalendarDateSelect.format[:javascript_include]}" if CalendarDateSelect.format[:javascript_include] - files - end - - # returns html necessary to load javascript and css to make calendar_date_select work - def calendar_date_select_includes(*args) - return "" if @cds_already_included - @cds_already_included=true - - options = (Hash === args.last) ? args.pop : {} - options.assert_valid_keys(:style, :locale) - options[:style] ||= args.shift - - javascript_include_tag(*calendar_date_select_javascripts(:locale => options[:locale])) + "\n" + - stylesheet_link_tag(*calendar_date_select_stylesheets(:style => options[:style])) + "\n" - end -end diff --git a/timcharper-calendar_date_select-d3b2b8c/public/blank_iframe.html b/timcharper-calendar_date_select-d3b2b8c/public/blank_iframe.html deleted file mode 100755 index e5bd1f4..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/blank_iframe.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/timcharper-calendar_date_select-d3b2b8c/public/images/calendar_date_select/calendar.gif b/timcharper-calendar_date_select-d3b2b8c/public/images/calendar_date_select/calendar.gif deleted file mode 100755 index 6b7b7ca..0000000 Binary files a/timcharper-calendar_date_select-d3b2b8c/public/images/calendar_date_select/calendar.gif and /dev/null differ diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/calendar_date_select.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/calendar_date_select.js deleted file mode 100755 index e14befb..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/calendar_date_select.js +++ /dev/null @@ -1,448 +0,0 @@ -// CalendarDateSelect version 1.16.1 - a prototype based date picker -// Questions, comments, bugs? - see the project page: http://code.google.com/p/calendardateselect -if (typeof Prototype == 'undefined') alert("CalendarDateSelect Error: Prototype could not be found. Please make sure that your application's layout includes prototype.js (.g. <%= javascript_include_tag :defaults %>) *before* it includes calendar_date_select.js (.g. <%= calendar_date_select_includes %>)."); -if (Prototype.Version < "1.6") alert("Prototype 1.6.0 is required. If using earlier version of prototype, please use calendar_date_select version 1.8.3"); - -Element.addMethods({ - purgeChildren: function(element) { $A(element.childNodes).each(function(e){$(e).remove();}); }, - build: function(element, type, options, style) { - var newElement = Element.buildAndAppend(type, options, style); - element.appendChild(newElement); - return newElement; - } -}); - -Element.buildAndAppend = function(type, options, style) -{ - var e = $(document.createElement(type)); - $H(options).each(function(pair) { e[pair.key] = pair.value }); - if (style) e.setStyle(style); - return e; -}; -nil = null; - -Date.one_day = 24*60*60*1000; -Date.weekdays = $w("S M T W T F S"); -Date.first_day_of_week = 0; -Date.months = $w("January February March April May June July August September October November December" ); -Date.padded2 = function(hour) { var padded2 = parseInt(hour, 10); if (hour < 10) padded2 = "0" + padded2; return padded2; } -Date.prototype.getPaddedMinutes = function() { return Date.padded2(this.getMinutes()); } -Date.prototype.getAMPMHour = function() { var hour = this.getHours(); return (hour == 0) ? 12 : (hour > 12 ? hour - 12 : hour ) } -Date.prototype.getAMPM = function() { return (this.getHours() < 12) ? "AM" : "PM"; } -Date.prototype.stripTime = function() { return new Date(this.getFullYear(), this.getMonth(), this.getDate());}; -Date.prototype.daysDistance = function(compare_date) { return Math.round((compare_date - this) / Date.one_day); }; -Date.prototype.toFormattedString = function(include_time){ - var hour, str; - str = Date.months[this.getMonth()] + " " + this.getDate() + ", " + this.getFullYear(); - - if (include_time) { hour = this.getHours(); str += " " + this.getAMPMHour() + ":" + this.getPaddedMinutes() + " " + this.getAMPM() } - return str; -} -Date.parseFormattedString = function(string) { return new Date(string);} -Math.floor_to_interval = function(n, i) { return Math.floor(n/i) * i;} -window.f_height = function() { return( [window.innerHeight ? window.innerHeight : null, document.documentElement ? document.documentElement.clientHeight : null, document.body ? document.body.clientHeight : null].select(function(x){return x>0}).first()||0); } -window.f_scrollTop = function() { return ([window.pageYOffset ? window.pageYOffset : null, document.documentElement ? document.documentElement.scrollTop : null, document.body ? document.body.scrollTop : null].select(function(x){return x>0}).first()||0 ); } - -_translations = { - "OK": "OK", - "Now": "Now", - "Today": "Today", - "Clear": "Clear" -} -SelectBox = Class.create(); -SelectBox.prototype = { - initialize: function(parent_element, values, html_options, style_options) { - this.element = $(parent_element).build("select", html_options, style_options); - this.populate(values); - }, - populate: function(values) { - this.element.purgeChildren(); - var that = this; $A(values).each(function(pair) { if (typeof(pair)!="object") {pair = [pair, pair]}; that.element.build("option", { value: pair[1], innerHTML: pair[0]}) }); - }, - setValue: function(value) { - var e = this.element; - var matched = false; - $R(0, e.options.length - 1 ).each(function(i) { if(e.options[i].value==value.toString()) {e.selectedIndex = i; matched = true;}; } ); - return matched; - }, - getValue: function() { return $F(this.element)} -} -CalendarDateSelect = Class.create(); -CalendarDateSelect.prototype = { - initialize: function(target_element, options) { - this.target_element = $(target_element); // make sure it's an element, not a string - if (!this.target_element) { alert("Target element " + target_element + " not found!"); return false;} - if (this.target_element.tagName != "INPUT") this.target_element = this.target_element.down("INPUT") - - this.target_element.calendar_date_select = this; - this.last_click_at = 0; - // initialize the date control - this.options = $H({ - embedded: false, - popup: nil, - time: false, - buttons: true, - clear_button: true, - year_range: 10, - close_on_click: nil, - minute_interval: 5, - popup_by: this.target_element, - month_year: "dropdowns", - onchange: this.target_element.onchange, - valid_date_check: nil - }).merge(options || {}); - this.use_time = this.options.get("time"); - this.parseDate(); - this.callback("before_show") - this.initCalendarDiv(); - if(!this.options.get("embedded")) { - this.positionCalendarDiv() - // set the click handler to check if a user has clicked away from the document - Event.observe(document, "mousedown", this.closeIfClickedOut_handler = this.closeIfClickedOut.bindAsEventListener(this)); - Event.observe(document, "keypress", this.keyPress_handler = this.keyPress.bindAsEventListener(this)); - } - this.callback("after_show") - }, - positionCalendarDiv: function() { - var above = false; - var c_pos = this.calendar_div.cumulativeOffset(), c_left = c_pos[0], c_top = c_pos[1], c_dim = this.calendar_div.getDimensions(), c_height = c_dim.height, c_width = c_dim.width; - var w_top = window.f_scrollTop(), w_height = window.f_height(); - var e_dim = $(this.options.get("popup_by")).cumulativeOffset(), e_top = e_dim[1], e_left = e_dim[0], e_height = $(this.options.get("popup_by")).getDimensions().height, e_bottom = e_top + e_height; - - if ( (( e_bottom + c_height ) > (w_top + w_height)) && ( e_bottom - c_height > w_top )) above = true; - var left_px = e_left.toString() + "px", top_px = (above ? (e_top - c_height ) : ( e_top + e_height )).toString() + "px"; - - this.calendar_div.style.left = left_px; this.calendar_div.style.top = top_px; - - this.calendar_div.setStyle({visibility:""}); - - // draw an iframe behind the calendar -- ugly hack to make IE 6 happy - if(navigator.appName=="Microsoft Internet Explorer") this.iframe = $(document.body).build("iframe", {src: "javascript:false", className: "ie6_blocker"}, { left: left_px, top: top_px, height: c_height.toString()+"px", width: c_width.toString()+"px", border: "0px"}) - }, - initCalendarDiv: function() { - if (this.options.get("embedded")) { - var parent = this.target_element.parentNode; - var style = {} - } else { - var parent = document.body - var style = { position:"absolute", visibility: "hidden", left:0, top:0 } - } - this.calendar_div = $(parent).build('div', {className: "calendar_date_select"}, style); - - var that = this; - // create the divs - $w("top header body buttons footer bottom").each(function(name) { - eval("var " + name + "_div = that." + name + "_div = that.calendar_div.build('div', { className: 'cds_"+name+"' }, { clear: 'left'} ); "); - }); - - this.initHeaderDiv(); - this.initButtonsDiv(); - this.initCalendarGrid(); - this.updateFooter(" "); - - this.refresh(); - this.setUseTime(this.use_time); - }, - initHeaderDiv: function() { - var header_div = this.header_div; - this.close_button = header_div.build("a", { innerHTML: "x", href:"#", onclick:function () { this.close(); return false; }.bindAsEventListener(this), className: "close" }); - this.next_month_button = header_div.build("a", { innerHTML: ">", href:"#", onclick:function () { this.navMonth(this.date.getMonth() + 1 ); return false; }.bindAsEventListener(this), className: "next" }); - this.prev_month_button = header_div.build("a", { innerHTML: "<", href:"#", onclick:function () { this.navMonth(this.date.getMonth() - 1 ); return false; }.bindAsEventListener(this), className: "prev" }); - - if (this.options.get("month_year")=="dropdowns") { - this.month_select = new SelectBox(header_div, $R(0,11).map(function(m){return [Date.months[m], m]}), {className: "month", onchange: function () { this.navMonth(this.month_select.getValue()) }.bindAsEventListener(this)}); - this.year_select = new SelectBox(header_div, [], {className: "year", onchange: function () { this.navYear(this.year_select.getValue()) }.bindAsEventListener(this)}); - this.populateYearRange(); - } else { - this.month_year_label = header_div.build("span") - } - }, - initCalendarGrid: function() { - var body_div = this.body_div; - this.calendar_day_grid = []; - var days_table = body_div.build("table", { cellPadding: "0px", cellSpacing: "0px", width: "100%" }) - // make the weekdays! - var weekdays_row = days_table.build("thead").build("tr"); - Date.weekdays.each( function(weekday) { - weekdays_row.build("th", {innerHTML: weekday}); - }); - - var days_tbody = days_table.build("tbody") - // Make the days! - var row_number = 0, weekday; - for(var cell_index = 0; cell_index<42; cell_index++) - { - weekday = (cell_index+Date.first_day_of_week ) % 7; - if ( cell_index % 7==0 ) days_row = days_tbody.build("tr", {className: 'row_'+row_number++}); - (this.calendar_day_grid[cell_index] = days_row.build("td", { - calendar_date_select: this, - onmouseover: function () { this.calendar_date_select.dayHover(this); }, - onmouseout: function () { this.calendar_date_select.dayHoverOut(this) }, - onclick: function() { this.calendar_date_select.updateSelectedDate(this, true); }, - className: (weekday==0) || (weekday==6) ? " weekend" : "" //clear the class - }, - { cursor: "pointer" } - )).build("div"); - this.calendar_day_grid[cell_index]; - } - }, - initButtonsDiv: function() - { - var buttons_div = this.buttons_div; - if (this.options.get("time")) - { - var blank_time = $A(this.options.get("time")=="mixed" ? [[" - ", ""]] : []); - buttons_div.build("span", {innerHTML:"@", className: "at_sign"}); - - var t = new Date(); - this.hour_select = new SelectBox(buttons_div, - blank_time.concat($R(0,23).map(function(x) {t.setHours(x); return $A([t.getAMPMHour()+ " " + t.getAMPM(),x])} )), - { - calendar_date_select: this, - onchange: function() { this.calendar_date_select.updateSelectedDate( { hour: this.value });}, - className: "hour" - } - ); - buttons_div.build("span", {innerHTML:":", className: "seperator"}); - var that = this; - this.minute_select = new SelectBox(buttons_div, - blank_time.concat($R(0,59).select(function(x){return (x % that.options.get('minute_interval')==0)}).map(function(x){ return $A([ Date.padded2(x), x]); } ) ), - { - calendar_date_select: this, - onchange: function() { this.calendar_date_select.updateSelectedDate( {minute: this.value }) }, - className: "minute" - } - ); - - } else if (! this.options.get("buttons")) buttons_div.remove(); - - if (this.options.get("buttons")) { - buttons_div.build("span", {innerHTML: " "}); - if (this.options.get("time")=="mixed" || !this.options.get("time")) b = buttons_div.build("a", { - innerHTML: _translations["Today"], - href: "#", - onclick: function() {this.today(false); return false;}.bindAsEventListener(this) - }); - - if (this.options.get("time")=="mixed") buttons_div.build("span", {innerHTML: " | ", className:"button_seperator"}) - - if (this.options.get("time")) b = buttons_div.build("a", { - innerHTML: _translations["Now"], - href: "#", - onclick: function() {this.today(true); return false}.bindAsEventListener(this) - }); - - if (!this.options.get("embedded") && !this.closeOnClick()) - { - buttons_div.build("span", {innerHTML: " | ", className:"button_seperator"}) - buttons_div.build("a", { innerHTML: _translations["OK"], href: "#", onclick: function() {this.close(); return false;}.bindAsEventListener(this) }); - } - if (this.options.get('clear_button')) { - buttons_div.build("span", {innerHTML: " | ", className:"button_seperator"}) - buttons_div.build("a", { innerHTML: _translations["Clear"], href: "#", onclick: function() {this.clearDate(); if (!this.options.get("embedded")) this.close(); return false;}.bindAsEventListener(this) }); - } - } - }, - refresh: function () - { - this.refreshMonthYear(); - this.refreshCalendarGrid(); - - this.setSelectedClass(); - this.updateFooter(); - }, - refreshCalendarGrid: function () { - this.beginning_date = new Date(this.date).stripTime(); - this.beginning_date.setDate(1); - this.beginning_date.setHours(12); // Prevent daylight savings time boundaries from showing a duplicate day - var pre_days = this.beginning_date.getDay() // draw some days before the fact - if (pre_days < 3) pre_days += 7; - this.beginning_date.setDate(1 - pre_days + Date.first_day_of_week); - - var iterator = new Date(this.beginning_date); - - var today = new Date().stripTime(); - var this_month = this.date.getMonth(); - vdc = this.options.get("valid_date_check"); - for (var cell_index = 0;cell_index<42; cell_index++) - { - day = iterator.getDate(); month = iterator.getMonth(); - cell = this.calendar_day_grid[cell_index]; - Element.remove(cell.childNodes[0]); div = cell.build("div", {innerHTML:day}); - if (month!=this_month) div.className = "other"; - cell.day = day; cell.month = month; cell.year = iterator.getFullYear(); - if (vdc) { if (vdc(iterator.stripTime())) cell.removeClassName("disabled"); else cell.addClassName("disabled") }; - iterator.setDate( day + 1); - } - - if (this.today_cell) this.today_cell.removeClassName("today"); - - if ( $R( 0, 41 ).include(days_until = this.beginning_date.stripTime().daysDistance(today)) ) { - this.today_cell = this.calendar_day_grid[days_until]; - this.today_cell.addClassName("today"); - } - }, - refreshMonthYear: function() { - var m = this.date.getMonth(); - var y = this.date.getFullYear(); - // set the month - if (this.options.get("month_year") == "dropdowns") - { - this.month_select.setValue(m, false); - - var e = this.year_select.element; - if (this.flexibleYearRange() && (!(this.year_select.setValue(y, false)) || e.selectedIndex <= 1 || e.selectedIndex >= e.options.length - 2 )) this.populateYearRange(); - - this.year_select.setValue(y); - - } else { - this.month_year_label.update( Date.months[m] + " " + y.toString() ); - } - }, - populateYearRange: function() { - this.year_select.populate(this.yearRange().toArray()); - }, - yearRange: function() { - if (!this.flexibleYearRange()) - return $R(this.options.get("year_range")[0], this.options.get("year_range")[1]); - - var y = this.date.getFullYear(); - return $R(y - this.options.get("year_range"), y + this.options.get("year_range")); - }, - flexibleYearRange: function() { return (typeof(this.options.get("year_range")) == "number"); }, - validYear: function(year) { if (this.flexibleYearRange()) { return true;} else { return this.yearRange().include(year);} }, - dayHover: function(element) { - var hover_date = new Date(this.selected_date); - hover_date.setYear(element.year); hover_date.setMonth(element.month); hover_date.setDate(element.day); - this.updateFooter(hover_date.toFormattedString(this.use_time)); - }, - dayHoverOut: function(element) { this.updateFooter(); }, - clearSelectedClass: function() {if (this.selected_cell) this.selected_cell.removeClassName("selected");}, - setSelectedClass: function() { - if (!this.selection_made) return; - this.clearSelectedClass() - if ($R(0,42).include( days_until = this.beginning_date.stripTime().daysDistance(this.selected_date.stripTime()) )) { - this.selected_cell = this.calendar_day_grid[days_until]; - this.selected_cell.addClassName("selected"); - } - }, - reparse: function() { this.parseDate(); this.refresh(); }, - dateString: function() { - return (this.selection_made) ? this.selected_date.toFormattedString(this.use_time) : " "; - }, - parseDate: function() - { - var value = $F(this.target_element).strip() - var default_time = this.options.get("default_time"); - this.selection_made = (value != "" || default_time); - this.date = value=="" ? NaN : Date.parseFormattedString(this.options.get("date") || value); - if (isNaN(this.date) && !default_time) - this.date = new Date(); - else if (isNaN(this.date) && default_time) - this.date = (Object.prototype.toString.apply(default_time) === '[object Function]') ? default_time() : default_time; - - if (!this.validYear(this.date.getFullYear())) this.date.setYear( (this.date.getFullYear() < this.yearRange().start) ? this.yearRange().start : this.yearRange().end); - this.selected_date = new Date(this.date); - this.use_time = /[0-9]:[0-9]{2}/.exec(value) ? true : false; - this.date.setDate(1); - }, - updateFooter:function(text) { if (!text) text = this.dateString(); this.footer_div.purgeChildren(); this.footer_div.build("span", {innerHTML: text }); }, - clearDate:function() { - if ((this.target_element.disabled || this.target_element.readOnly) && this.options.get("popup") != "force") return false; - var last_value = this.target_element.value; - this.target_element.value = ""; - this.clearSelectedClass(); - this.updateFooter(' '); - if (last_value!=this.target_element.value) this.callback("onchange"); - }, - updateSelectedDate:function(partsOrElement, via_click) { - var parts = $H(partsOrElement); - if ((this.target_element.disabled || this.target_element.readOnly) && this.options.get("popup") != "force") return false; - if (parts.get("day")) { - var t_selected_date = this.selected_date, vdc = this.options.get("valid_date_check"); - t_selected_date.setYear(parts.get("year")); - t_selected_date.setMonth(parts.get("month")); - t_selected_date.setDate(parts.get("day")); - - if (vdc && ! vdc(t_selected_date.stripTime())) { return false; } - this.selected_date = t_selected_date; - this.selection_made = true; - } - - if (!isNaN(parts.get("hour"))) this.selected_date.setHours(parts.get("hour")); - if (!isNaN(parts.get("minute"))) this.selected_date.setMinutes( Math.floor_to_interval(parts.get("minute"), this.options.get("minute_interval")) ); - if (parts.get("hour") === "" || parts.get("minute") === "") - this.setUseTime(false); - else if (!isNaN(parts.get("hour")) || !isNaN(parts.get("minute"))) - this.setUseTime(true); - - this.updateFooter(); - this.setSelectedClass(); - - if (this.selection_made) this.updateValue(); - if (this.closeOnClick()) { this.close(); } - if (via_click && !this.options.get("embedded")) { - if ((new Date() - this.last_click_at) < 333) this.close(); - this.last_click_at = new Date(); - } - }, - closeOnClick: function() { - if (this.options.get("embedded")) return false; - if (this.options.get("close_on_click")===nil ) - return (this.options.get("time")) ? false : true - else - return (this.options.get("close_on_click")) - }, - navMonth: function(month) { (target_date = new Date(this.date)).setMonth(month); return (this.navTo(target_date)); }, - navYear: function(year) { (target_date = new Date(this.date)).setYear(year); return (this.navTo(target_date)); }, - navTo: function(date) { - if (!this.validYear(date.getFullYear())) return false; - this.date = date; - this.date.setDate(1); - this.refresh(); - this.callback("after_navigate", this.date); - return true; - }, - setUseTime: function(turn_on) { - this.use_time = this.options.get("time") && (this.options.get("time")=="mixed" ? turn_on : true) // force use_time to true if time==true && time!="mixed" - if (this.use_time && this.selected_date) { // only set hour/minute if a date is already selected - var minute = Math.floor_to_interval(this.selected_date.getMinutes(), this.options.get("minute_interval")); - var hour = this.selected_date.getHours(); - - this.hour_select.setValue(hour); - this.minute_select.setValue(minute) - } else if (this.options.get("time")=="mixed") { - this.hour_select.setValue(""); this.minute_select.setValue(""); - } - }, - updateValue: function() { - var last_value = this.target_element.value; - this.target_element.value = this.dateString(); - if (last_value!=this.target_element.value) this.callback("onchange"); - }, - today: function(now) { - var d = new Date(); this.date = new Date(); - var o = $H({ day: d.getDate(), month: d.getMonth(), year: d.getFullYear(), hour: d.getHours(), minute: d.getMinutes()}); - if ( ! now ) o = o.merge({hour: "", minute:""}); - this.updateSelectedDate(o, true); - this.refresh(); - }, - close: function() { - if (this.closed) return false; - this.callback("before_close"); - this.target_element.calendar_date_select = nil; - Event.stopObserving(document, "mousedown", this.closeIfClickedOut_handler); - Event.stopObserving(document, "keypress", this.keyPress_handler); - this.calendar_div.remove(); this.closed = true; - if (this.iframe) this.iframe.remove(); - if (this.target_element.type != "hidden" && ! this.target_element.disabled) this.target_element.focus(); - this.callback("after_close"); - }, - closeIfClickedOut: function(e) { - if (! $(Event.element(e)).descendantOf(this.calendar_div) ) this.close(); - }, - keyPress: function(e) { - if (e.keyCode==Event.KEY_ESC) this.close(); - }, - callback: function(name, param) { if (this.options.get(name)) { this.options.get(name).bind(this.target_element)(param); } } -} \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_american.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_american.js deleted file mode 100755 index 13e7bdd..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_american.js +++ /dev/null @@ -1,35 +0,0 @@ -// American Format: 12/31/2000 5:00 pm -// Thanks, Wes Hays -Date.prototype.toFormattedString = function(include_time){ - str = Date.padded2(this.getMonth() + 1) + '/' +Date.padded2(this.getDate()) + '/' + this.getFullYear(); - - if (include_time) { hour=this.getHours(); str += " " + this.getAMPMHour() + ":" + this.getPaddedMinutes() + " " + this.getAMPM() } - return str; -} - -Date.parseFormattedString = function (string) { - // Test these with and without the time - // 11/11/1111 12pm - // 11/11/1111 1pm - // 1/11/1111 10:10pm - // 11/1/1111 01pm - // 1/1/1111 01:11pm - // 1/1/1111 1:11pm - var regexp = "(([0-1]?[0-9])\/[0-3]?[0-9]\/[0-9]{4}) *([0-9]{1,2}(:[0-9]{2})? *(am|pm))?"; - string = string.strip(); - var d = string.match(new RegExp(regexp, "i")); - if (d==null) { - return Date.parse(string); // Give javascript a chance to parse it. - } - - mdy = d[1].split('/'); - hrs = 0; - mts = 0; - if(d[3] != null && d[3].strip() != "") { - hrs = parseInt(d[3].split('')[0], 10); - if(d[5].toLowerCase() == 'pm') { hrs += 12; } // Add 12 more to hrs - mts = d[4].split(':')[1]; - } - - return new Date(mdy[2], parseInt(mdy[0], 10)-1, mdy[1], hrs, mts, 0); -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_danish.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_danish.js deleted file mode 100755 index 5da7c2c..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_danish.js +++ /dev/null @@ -1,31 +0,0 @@ -// Formats date and time as "2000/01/20 17:00" -Date.prototype.toFormattedString = function(include_time){ - str = Date.padded2(this.getDate()) + "/" + Date.padded2(this.getMonth() + 1) + "/" + this.getFullYear(); - - if (include_time) { - str += " " + this.getHours() + ":" + this.getPaddedMinutes(); - } - return str; -} - -// Parses date and time as "2000/01/20 17:00" -Date.parseFormattedString = function(string) { - var regexp = "([0-9]{2})/([0-9]{2})/([0-9]{4})" + - "( ([0-9]{1,2}):([0-9]{2})(:([0-9]{2})(.([0-9]{3}))?)?" + - ")?"; - var d = string.match(new RegExp(regexp, "i")); - if (d==null) return Date.parse(string); // at least give javascript a crack at it. - var offset = 0; - var date = new Date(d[3], 0, 1); - if (d[2]) { date.setMonth(d[2] - 1); } - if (d[1]) { date.setDate(d[1]); } - if (d[4]) { - hours = parseInt(d[5], 10); - date.setHours(hours); - } - if (d[6]) { date.setMinutes(d[6]); } - //if (d[8]) { date.setSeconds(d[7]); } - //if (d[9]) { date.setMiliseconds(Number("0." + d[8]) * 1000); } - - return date; -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_db.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_db.js deleted file mode 100755 index a3f10d4..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_db.js +++ /dev/null @@ -1,27 +0,0 @@ -// DB No Seconds Format: 2007-12-05 12:00 - -Date.padded2 = function(hour) { padded2 = hour.toString(); if ((parseInt(hour) < 10) || (parseInt(hour) == null)) padded2="0" + padded2; return padded2; } -Date.prototype.getAMPMHour = function() { hour=Date.padded2(this.getHours()); return (hour == null) ? 00 : (hour > 24 ? hour - 24 : hour ) } -Date.prototype.getAMPM = function() { return (this.getHours() < 12) ? "" : ""; } - -Date.prototype.toFormattedString = function(include_time){ - str = this.getFullYear() + "-" + (this.getMonth() + 1) + "-" + Date.padded2(this.getDate()); - if (include_time) { hour=this.getHours(); str += " " + this.getAMPMHour() + ":" + this.getPaddedMinutes() } - return str; -} - -Date.parseFormattedString = function (string) { - var regexp = '([0-9]{4})-(([0-9]{1,2})-(([0-9]{1,2})( ([0-9]{1,2}):([0-9]{2})? *)?)?)?'; - var d = string.match(new RegExp(regexp, "i")); - if (d==null) return Date.parse(string); // at least give javascript a crack at it. - var offset = 0; - var date = new Date(d[1], 0, 1); - if (d[3]) { date.setMonth(d[3] - 1); } - if (d[5]) { date.setDate(d[5]); } - if (d[7]) { - date.setHours(parseInt(d[7], 10)); - } - if (d[8]) { date.setMinutes(d[8]); } - if (d[10]) { date.setSeconds(d[10]); } - return date; -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_euro_24hr.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_euro_24hr.js deleted file mode 100755 index 7249fcb..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_euro_24hr.js +++ /dev/null @@ -1,7 +0,0 @@ -// Formats date and time as "01 January 2000 17:00" -Date.prototype.toFormattedString = function(include_time) -{ - str = Date.padded2(this.getDate()) + " " + Date.months[this.getMonth()] + " " + this.getFullYear(); - if (include_time) { str += " " + this.getHours() + ":" + this.getPaddedMinutes() } - return str; -} \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_euro_24hr_ymd.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_euro_24hr_ymd.js deleted file mode 100755 index 7105c73..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_euro_24hr_ymd.js +++ /dev/null @@ -1,7 +0,0 @@ -// Formats date and time as "2000.01.20 17:00" -Date.prototype.toFormattedString = function(include_time) -{ - str = this.getFullYear() + "." + Date.padded2(this.getMonth()+1) + "." + Date.padded2(this.getDate()); - if (include_time) { str += " " + this.getHours() + ":" + this.getPaddedMinutes() } - return str; -} \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_finnish.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_finnish.js deleted file mode 100755 index 520390f..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_finnish.js +++ /dev/null @@ -1,32 +0,0 @@ -Date.padded2 = function(hour) { padded2 = hour.toString(); if ((parseInt(hour) < 10) || (parseInt(hour) == null)) padded2="0" + padded2; return padded2; } -Date.prototype.getAMPMHour = function() { hour=Date.padded2(this.getHours()); return (hour == null) ? 00 : (hour > 24 ? hour - 24 : hour ) } -Date.prototype.getAMPM = function() { return (this.getHours() < 12) ? "" : ""; } - -Date.prototype.toFormattedString = function(include_time){ - str = this.getDate() + "." + (this.getMonth() + 1) + "." + this.getFullYear(); - if (include_time) { hour=this.getHours(); str += " " + this.getAMPMHour() + ":" + this.getPaddedMinutes() } - return str; -} -Date.parseFormattedString = function (string) { - var regexp = '([0-9]{1,2})\.(([0-9]{1,2})\.(([0-9]{2,4})( ([0-9]{1,2}):([0-9]{2})? *)?)?)?'; - var d = string.match(new RegExp(regexp, "i")); - if (d==null) return Date.parse(string); // at least give javascript a crack at it. - var offset = 0; - if (d[5] && d[5].length == 2) { - // we got only two digits for the year... - d[5] = Number(d[5]); - if (d[5] > 30) - d[5] += 1900; - else - d[5] += 2000; - } - var date = new Date(d[5], 0, 1); - if (d[3]) { date.setMonth(d[3] - 1); } - if (d[5]) { date.setDate(d[1]); } - if (d[7]) { - date.setHours(parseInt(d[7], 10)); - } - if (d[8]) { date.setMinutes(d[8]); } - if (d[10]) { date.setSeconds(d[10]); } - return date; -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_hyphen_ampm.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_hyphen_ampm.js deleted file mode 100755 index ee7ab1e..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_hyphen_ampm.js +++ /dev/null @@ -1,37 +0,0 @@ -Date.prototype.toFormattedString = function(include_time){ - str = this.getFullYear() + "-" + Date.padded2(this.getMonth() + 1) + "-" +Date.padded2(this.getDate()); - -if (include_time) { hour=this.getHours(); str += " " + this.getAMPMHour() + ":" + this.getPaddedMinutes() + " " + this.getAMPM() } -return str; -} - -Date.parseFormattedString = function (string) { - var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" + - "( ([0-9]{1,2}):([0-9]{2})? *(pm|am)" + - "?)?)?)?"; - var d = string.match(new RegExp(regexp, "i")); - if (d==null) return Date.parse(string); // at least give javascript a crack at it. - var offset = 0; - var date = new Date(d[1], 0, 1); - if (d[3]) { date.setMonth(d[3] - 1); } - if (d[5]) { date.setDate(d[5]); } - if (d[7]) { - hours = parseInt(d[7], 10); - offset=0; - if (d[9]) { - is_pm = (d[9].toLowerCase()=="pm"); - if (is_pm && hours <= 11) hours+=12; - if (!is_pm && hours == 12) hours=0; - } - date.setHours(hours); - } - if (d[8]) { date.setMinutes(d[8]); } - if (d[10]) { date.setSeconds(d[10]); } - if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); } - if (d[14]) { - offset = (Number(d[16]) * 60) + Number(d[17]); - offset *= ((d[15] == '-') ? 1 : -1); - } - - return date; -} \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_iso_date.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_iso_date.js deleted file mode 100755 index 6f8a548..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_iso_date.js +++ /dev/null @@ -1,29 +0,0 @@ -// International date format (ISO 8601): yyyy-mm-dd -// Including time (no seconds): yyyy-mm-dd HH:MM -Date.prototype.toFormattedString = function(include_time) { - var hour; - var str = this.getFullYear() + "-" + Date.padded2(this.getMonth() + 1) + "-" +Date.padded2(this.getDate()); - if (include_time) { - hour = Date.padded2(this.getHours()); - str += " " + hour + ":" + this.getPaddedMinutes(); - } - return str; -}; - -// TODO: take care of timezone offsets -// as the timezone is not displayed in the input, -// this could be tricky (or just unnessesary) -Date.parseFormattedString = function (string) { - var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" + - "([T| ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" + - "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?"; - var d = string.match(new RegExp(regexp)); - - var date = new Date(d[1], 0, 1); - - if (d[3]) { date.setMonth(d[3] - 1); } - if (d[5]) { date.setDate(d[5]); } - if (d[7]) { date.setHours(d[7]); } - if (d[8]) { date.setMinutes(d[8]); } - return date; -}; \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_italian.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_italian.js deleted file mode 100755 index c60b6ad..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/format_italian.js +++ /dev/null @@ -1,24 +0,0 @@ -// Italian Format: 31/12/2000 23:00 -// Thanks, Bigonazzi! - -Date.prototype.toFormattedString = function(include_time){ - str = this.getDate() + "/" + (this.getMonth() + 1) + "/" + this.getFullYear(); - if (include_time) { str += " " + this.getHours() + ":" + this.getPaddedMinutes() } - return str; -} - -Date.parseFormattedString = function (string) { - var regexp = '([0-9]{1,2})/(([0-9]{1,2})/(([0-9]{4})( ([0-9]{1,2}):([0-9]{2})? *)?)?)?'; - var d = string.match(new RegExp(regexp, "i")); - if (d==null) return Date.parse(string); // at least give javascript a crack at it. - var offset = 0; - var date = new Date(d[5], 0, 1); - if (d[3]) { date.setMonth(d[3] - 1); } - if (d[5]) { date.setDate(d[1]); } - if (d[7]) { - date.setHours(parseInt(d[7], 10)); - } - if (d[8]) { date.setMinutes(d[8]); } - if (d[10]) { date.setSeconds(d[10]); } - return date; -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/ar.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/ar.js deleted file mode 100755 index 2206276..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/ar.js +++ /dev/null @@ -1,10 +0,0 @@ -Date.weekdays = ['سبت', 'أحد', 'إثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة']; -Date.months = ['كانون ثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين أول', 'تشرين ثاني', 'كانون أول']; -Date.first_day_of_week = 6; - -_translations = { - "OK": "نفذ", - "Now": "الآن", - "Today": "اليوم", - "Clear": "إلغاء" -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/da.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/da.js deleted file mode 100755 index ec70aca..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/da.js +++ /dev/null @@ -1,11 +0,0 @@ -Date.weekdays = $w('Ma Ti On To Fr Lø Sø'); -Date.months = $w('Januar Februar Marts April Maj Juni Juli August September Oktober November December'); - -Date.first_day_of_week = 1; - -_translations = { - "OK": "Vælg", - "Now": "Nu", - "Today": "I dag", - "Clear": "Slet" -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/de.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/de.js deleted file mode 100755 index ff9d439..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/de.js +++ /dev/null @@ -1,11 +0,0 @@ -Date.weekdays = $w('Mo Di Mi Do Fr Sa So'); -Date.months = $w('Januar Februar März April Mai Juni Juli August September Oktober November Dezember'); - -Date.first_day_of_week = 1; - -_translations = { - "OK": "OK", - "Now": "Jetzt", - "Today": "Heute", - "Clear": "Löschen" -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/es.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/es.js deleted file mode 100755 index b3fd554..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/es.js +++ /dev/null @@ -1,11 +0,0 @@ -Date.weekdays = $w("L M X J V S D"); -Date.months = $w("Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre" ); - -Date.first_day_of_week = 1; - -_translations = { - "OK": "Cancelar", - "Now": "Ahora", - "Clear": "Limpiar", - "Today": "Hoy" -} \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/fi.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/fi.js deleted file mode 100755 index 443c910..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/fi.js +++ /dev/null @@ -1,10 +0,0 @@ -Date.weekdays = $w("Ma Ti Ke To Pe La Su"); -Date.months = $w("Tammikuu Helmikuu Maaliskuu Huhtikuu Toukokuu Keskuu Heinkuu Elokuu Syyskuu Lokakuu Marraskuu Joulukuu" ); - -Date.first_day_of_week = 1 - -_translations = { - "OK": "OK", - "Now": "Nyt", - "Today": "Tnn" -} \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/fr.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/fr.js deleted file mode 100755 index 78c604e..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/fr.js +++ /dev/null @@ -1,11 +0,0 @@ -Date.weekdays = $w('L Ma Me J V S D'); -Date.months = $w('Janvier Février Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre Décembre'); - -Date.first_day_of_week = 1; - -_translations = { - "OK": "OK", - "Now": "Maintenant", - "Today": "Aujourd'hui", - "Clear": "Effacer", -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/it.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/it.js deleted file mode 100755 index 6cd5f62..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/it.js +++ /dev/null @@ -1,9 +0,0 @@ -Date.weekdays = $w('Lu Ma Me Gi Ve Sa Do'); -Date.months = $w('Gennaio Febbraio Marzo Aprile Maggio Giugno Luglio Agosto Settembre Ottobre Novembre Dicembre'); -Date.first_day_of_week = 1; -_translations = { - "OK": "OK", - "Now": "Ora", - "Today": "Oggi", - "Clear": "Cancella" -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/nl.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/nl.js deleted file mode 100755 index 00f0f2e..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/nl.js +++ /dev/null @@ -1,11 +0,0 @@ -Date.weekdays = $w('Ma Di Wo Do Vr Za Zo'); -Date.months = $w('januari februari maart april mei juni juli augustus september oktober november december'); - -Date.first_day_of_week = 1; - -_translations = { - "OK": "OK", - "Now": "Nu", - "Today": "Vandaag", - "Clear": "Wissen" -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/pl.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/pl.js deleted file mode 100755 index 77bfb2c..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/pl.js +++ /dev/null @@ -1,11 +0,0 @@ -Date.weekdays = $w('P W Ś C P S N'); -Date.months = $w('Styczeń Luty Marzec Kwiecień Maj Czerwiec Lipiec Sierpień Wrzesień Październik Listopad Grudzień'); - -Date.first_day_of_week = 1 - -_translations = { - "OK": "OK", - "Now": "Teraz", - "Clear": "Wyczyść", - "Today": "Dziś" -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/pt.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/pt.js deleted file mode 100755 index 30293b5..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/pt.js +++ /dev/null @@ -1,11 +0,0 @@ -Date.weekdays = $w('D S T Q Q S S'); -Date.months = $w('Janeiro Fevereiro Março Abril Maio Junho Julho Agosto Setembro Outubro Novembro Dezembro'); - -Date.first_day_of_week = 0 - -_translations = { - "OK": "OK", - "Now": "Agora", - "Today": "Hoje", - "Clear": "Limpar" -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/ru.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/ru.js deleted file mode 100755 index 8dc5c20..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/ru.js +++ /dev/null @@ -1,10 +0,0 @@ -Date.weekdays = $w('Пн Вт Ср Чт Пт Сб Вс'); -Date.months = $w('Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь'); - -Date.first_day_of_week = 1 - -_translations = { - "OK": "OK", - "Now": "Сейчас", - "Today": "Сегодня" -} \ No newline at end of file diff --git a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/sl.js b/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/sl.js deleted file mode 100755 index 677d352..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/javascripts/calendar_date_select/locale/sl.js +++ /dev/null @@ -1,11 +0,0 @@ -Date.weekdays = $w('Po To Sr Če Pe So Ne'); -Date.months = $w('Januar Februar Marec April Maj Junij Julij Avgust September Oktober November December'); - -Date.first_day_of_week = 1; - -_translations = { - "OK": "OK", - "Now": "Trenutno", - "Today": "Danes", - "Clear": "Pobriši" -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/blue.css b/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/blue.css deleted file mode 100755 index 31a5cbd..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/blue.css +++ /dev/null @@ -1,130 +0,0 @@ -.calendar_date_select { - color:white; - border:#777 1px solid; - display:block; - width:195px; - z-index: 1000; -} -/* this is a fun ie6 hack to get drop downs to stay behind the popup window. This should always be just underneath .calendar_date_select */ -iframe.ie6_blocker { - position: absolute; - z-index: 999; -} - -.calendar_date_select thead th { - font-weight:bold; - background-color: #000; - border-top:1px solid #777; - border-bottom:2px solid #334; - color: white !important; -} - -.calendar_date_select .cds_buttons { - text-align:center; - padding:5px 0px; - background-color: #000055; -} - -.calendar_date_select .cds_footer { - background-color: black; - padding:3px; - font-size:12px; - text-align:center; -} - -.calendar_date_select table { - margin: 0px; - padding: 0px; -} - - -.calendar_date_select .cds_header { - background-color: #ccc; - border-bottom: 2px solid #aaa; - text-align:center; -} - -.calendar_date_select .cds_header span { - font-size:15px; - color: black; - font-weight: bold; -} - -.calendar_date_select select { font-size:11px;} - -.calendar_date_select .cds_header a:hover { - color: white; -} -.calendar_date_select .cds_header a { - width:22px; - height:20px; - text-decoration: none; - font-size:14px; - color:black !important; -} - -.calendar_date_select .cds_header a.prev { - float:left; -} - -.calendar_date_select .cds_header a.next { - float:right; -} - -.calendar_date_select .cds_header a.close { - float:right; - display:none; -} - - -.calendar_date_select .cds_header select.month { - width:90px; -} - -.calendar_date_select .cds_header select.year { - width:61px; -} - -.calendar_date_select .cds_buttons a { - color: white; - font-size: 9px; -} - -.calendar_date_select td { - background-color: #000066; - font-size:12px; - width: 24px; - height: 21px; - text-align:center; - vertical-align: middle; -} -.calendar_date_select td.weekend { - background-color: #00005a; -} - -.calendar_date_select td div.other { - color: #4C5593; -} - -.calendar_date_select tbody td { - border-bottom: 1px solid #000044; -} -.calendar_date_select td.selected { - background-color:white; - color:black; -} - -.calendar_date_select td:hover { - background-color:#ccc; -} - -.calendar_date_select td.disabled div { - color: #000044; -} -.calendar_date_select td.today { - border: 1px dashed blue; -} - -.fieldWithErrors .calendar_date_select { - border: 2px solid red; -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/default.css b/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/default.css deleted file mode 100755 index c718383..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/default.css +++ /dev/null @@ -1,135 +0,0 @@ -.calendar_date_select { - color:white; - border:#777 1px solid; - display:block; - width:195px; - z-index: 1000; -} -/* this is a fun ie6 hack to get drop downs to stay behind the popup window. This should always be just underneath .calendar_date_select */ -iframe.ie6_blocker { - position: absolute; - z-index: 999; -} - -.calendar_date_select thead th { - font-weight:bold; - background-color: #aaa; - border-top:1px solid #777; - border-bottom:1px solid #777; - color: white !important; -} - -.calendar_date_select .cds_buttons { - text-align:center; - padding:5px 0px; - background-color: #555; -} - -.calendar_date_select .cds_footer { - background-color: black; - padding:3px; - font-size:12px; - text-align:center; -} - -.calendar_date_select table { - margin: 0px; - padding: 0px; -} - - -.calendar_date_select .cds_header { - background-color: #ccc; - border-bottom: 2px solid #aaa; - text-align:center; -} - -.calendar_date_select .cds_header span { - font-size:15px; - color: black; - font-weight: bold; -} - -.calendar_date_select select { font-size:11px;} - -.calendar_date_select .cds_header a:hover { - color: white; -} -.calendar_date_select .cds_header a { - width:22px; - height:20px; - text-decoration: none; - font-size:14px; - color:black !important; -} - -.calendar_date_select .cds_header a.prev { - float:left; -} -.calendar_date_select .cds_header a.next { - float:right; -} - -.calendar_date_select .cds_header a.close { - float:right; - display:none; -} - -.calendar_date_select .cds_header select.month { - width:90px; -} - -.calendar_date_select .cds_header select.year { - width:61px; -} -.calendar_date_select .cds_buttons a { - color: white; - font-size: 9px; -} - -.calendar_date_select td { - font-size:12px; - width: 24px; - height: 21px; - text-align:center; - vertical-align: middle; - background-color: #fff; -} -.calendar_date_select td.weekend { - background-color: #eee; - border-left:1px solid #ddd; - border-right:1px solid #ddd; -} - -.calendar_date_select td div { - color: #000; -} -.calendar_date_select td div.other { - color: #ccc; -} -.calendar_date_select td.selected div { - color:white; -} - -.calendar_date_select tbody td { - border-bottom: 1px solid #ddd; -} -.calendar_date_select td.selected { - background-color:#777; -} - -.calendar_date_select td:hover { - background-color:#ccc; -} - -.calendar_date_select td.today { - border: 1px dashed #999; -} - -.calendar_date_select td.disabled div { - color: #e6e6e6; -} - -.fieldWithErrors .calendar_date_select { - border: 2px solid red; -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/green.css b/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/green.css deleted file mode 100755 index 4a057ce..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/green.css +++ /dev/null @@ -1,142 +0,0 @@ -.calendar_date_select { - color:white; - border:#002b7f 1px solid; - display:block; - width:195px; - z-index: 1000; -} -/* this is a fun ie6 hack to get drop downs to stay behind the popup window. This should always be just underneath .calendar_date_select */ -iframe.ie6_blocker { - position: absolute; - z-index: 999; -} - -.calendar_date_select thead th { - font-weight:bold; - background-color: #56aa1c; - border-bottom:2px solid #002b7f; - color: #002b7f !important; -} - -.calendar_date_select .cds_buttons { - text-align:center; - padding:5px 0px; - background-color: #56aa1c; -} - -.calendar_date_select .cds_footer { - font-weight: bold; - background-color: #002b7f; - padding:3px; - text-align:center; -} - -.calendar_date_select table { - margin: 0px; - padding: 0px; -} - - -.calendar_date_select .cds_header { - background-color: #ccc; - border-bottom: 2px solid #002b7f; - text-align:center; -} - -.calendar_date_select .cds_header span { - font-size:15px; - color: black; - font-weight: bold; -} - -.calendar_date_select select { font-size:11px;} - -.calendar_date_select .cds_header a:hover { - color: white; -} -.calendar_date_select .cds_header a { - width:22px; - height:20px; - text-decoration: none; - font-size:14px; - color:black !important; -} - -.calendar_date_select .cds_header a.prev { - float:left; -} -.calendar_date_select .cds_header a.next { - float:right; -} - -.calendar_date_select .cds_header a.close { - float:right; - display:none; -} - -.calendar_date_select .cds_header select.month { - width:90px; -} - -.calendar_date_select .cds_header select.year { - width:61px; -} - -.calendar_date_select .cds_buttons a:hover { - color: white !important; -} - -.calendar_date_select .cds_buttons a { - font-weight:bold; - color: #c4ba00 !important; - font-size: 12px; -} - - - -.calendar_date_select td { - background-color: #56aa1c; - font-size:12px; - width: 24px; - height: 21px; - text-align:center; - vertical-align: middle; -} -.calendar_date_select td.weekend { - background-color: #56aa1c; -} - -.calendar_date_select td div { - color:#002b7f; -} -.calendar_date_select td div.other { - color: #c4ba00; -} -.calendar_date_select td.selected div { - color:black; -} - - -.calendar_date_select tbody td { - border-bottom: 1px solid #002b7f; -} -.calendar_date_select tbody td.selected { - background-color:white; - color:black; -} - -.calendar_date_select tbody td:hover { - background-color:#ccc; -} - -.calendar_date_select tbody td.today { - border: 1px dashed #002b7f; -} - -.calendar_date_select td.disabled div { - color: #440000; -} - -.fieldWithErrors .calendar_date_select { - border: 2px solid #002b7f; -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/plain.css b/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/plain.css deleted file mode 100755 index f5e57dd..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/plain.css +++ /dev/null @@ -1,128 +0,0 @@ -.calendar_date_select { - border:#777 1px solid; - display:block; - width:195px; - z-index: 1000; - background-color:white; -} -/* this is a fun ie6 hack to get drop downs to stay behind the popup window. This should always be just underneath .calendar_date_select */ -iframe.ie6_blocker { - position: absolute; - z-index: 999; -} - -.calendar_date_select thead th { - color: black !important; - font-weight:bold; -} - -.calendar_date_select .cds_buttons { - text-align:center; - padding:5px 0px; -} - -.calendar_date_select .cds_footer { - padding:3px; - font-size:10px; - text-align:center; -} - -.calendar_date_select table { - margin: 0px; - padding: 0px; -} - - -.calendar_date_select .cds_header { - text-align:center; -} - -.calendar_date_select .cds_header * { - border:0px; - background-color:white; -} - -.calendar_date_select .cds_header span { - font-size:15px; - color: black; - font-weight: bold; -} - -.calendar_date_select select { font-size:11px;} - -.calendar_date_select .cds_header a:hover { - color: white; -} -.calendar_date_select .cds_header a { - width:22px; - height:20px; - text-decoration: none; - font-size:14px; - color:black !important; -} - -.calendar_date_select .cds_header a.prev { - float:left; -} -.calendar_date_select .cds_header a.next { - float:right; -} -.calendar_date_select .cds_header a.close { - float:right; - display:none; -} - -.calendar_date_select .cds_header select.month { - width:90px; -} - -.calendar_date_select .cds_header select.year { - width:61px; -} - -.calendar_date_select .cds_buttons a { - color: black; - font-size: 9px; -} -.calendar_date_select td { - font-size:12px; - width: 24px; - height: 21px; - text-align:center; - vertical-align: middle; - background-color: #fff; -} -.calendar_date_select td.weekend { -} - -.calendar_date_select td div { - color: #000; -} -.calendar_date_select td div.other { - color: #ccc; -} -.calendar_date_select td.selected div { - color:white; -} - -.calendar_date_select tbody td { -} -.calendar_date_select td.selected { - background-color:#777; -} - -.calendar_date_select td:hover { - background-color:#ccc; -} - -.calendar_date_select td.today { - border: 1px dashed #999; -} - -.calendar_date_select td.disabled div { - color: #e6e6e6; -} - -.fieldWithErrors .calendar_date_select { - border: 2px solid red; -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/red.css b/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/red.css deleted file mode 100755 index a2ff2f2..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/red.css +++ /dev/null @@ -1,135 +0,0 @@ -.calendar_date_select { - color:white; - border:#777 1px solid; - display:block; - width:195px; - z-index: 1000; -} -/* this is a fun ie6 hack to get drop downs to stay behind the popup window. This should always be just underneath .calendar_date_select */ -iframe.ie6_blocker { - position: absolute; - z-index: 999; -} - -.calendar_date_select thead th { - font-weight:bold; - background-color: #E7E8E8; - border-bottom:2px solid black; - color: black !important; -} - -.calendar_date_select .cds_buttons { - text-align:center; - padding:5px 0px; - background-color: #5f0000; -} - -.calendar_date_select .cds_footer { - background-color: black; - padding:3px; - text-align:center; -} - -.calendar_date_select table { - margin: 0px; - padding: 0px; -} - - -.calendar_date_select .cds_header { - background-color: #ccc; - border-bottom: 2px solid #aaa; - text-align:center; -} - -.calendar_date_select .cds_header span { - font-size:15px; - color: black; - font-weight: bold; -} - -.calendar_date_select select { font-size:11px;} - -.calendar_date_select .cds_header a:hover { - color: white; -} -.calendar_date_select .cds_header a { - width:22px; - height:20px; - text-decoration: none; - font-size:14px; - color:black !important; -} - -.calendar_date_select .cds_header a.prev { - float:left; -} -.calendar_date_select .cds_header a.next { - float:right; -} - -.calendar_date_select .cds_header a.close { - float:right; - display:none; -} - -.calendar_date_select .cds_header select.month { - width:90px; -} - -.calendar_date_select .cds_header select.year { - width:61px; -} - -.calendar_date_select .cds_buttons a { - color: white; - font-size: 9px; -} - - -.calendar_date_select td { - background-color: #660000; - font-size:12px; - width: 24px; - height: 21px; - text-align:center; - vertical-align: middle; -} -.calendar_date_select td.weekend { - background-color: #5a0000; -} - -.calendar_date_select td div { - color:#fff; -} -.calendar_date_select td div.other { - color: #93554C; -} -.calendar_date_select td.selected div { - color:black; -} - - -.calendar_date_select tbody td { - border-bottom: 1px solid #550000; -} -.calendar_date_select tbody td.selected { - background-color:white; - color:black; -} - -.calendar_date_select tbody td:hover { - background-color:#ccc; -} - -.calendar_date_select tbody td.today { - border: 1px dashed red; -} - -.calendar_date_select td.disabled div { - color: #440000; -} - -.fieldWithErrors .calendar_date_select { - border: 2px solid red; -} diff --git a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/silver.css b/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/silver.css deleted file mode 100755 index 6e70cc6..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/public/stylesheets/calendar_date_select/silver.css +++ /dev/null @@ -1,133 +0,0 @@ -.calendar_date_select { - color:white; - border:#777 1px solid; - display:block; - width:195px; - z-index: 1000; -} -/* this is a fun ie6 hack to get drop downs to stay behind the popup window. This should always be just underneath .calendar_date_select */ -iframe.ie6_blocker { - position: absolute; - z-index: 999; -} - -.calendar_date_select thead th { - font-weight:bold; - background-color: #000; - border-top:1px solid #777; - border-bottom:2px solid #333; - color: white !important; -} - -.calendar_date_select .cds_buttons { - text-align:center; - padding:5px 0px; - background-color: #555; -} - -.calendar_date_select .cds_footer { - background-color: black; - padding:3px; - font-size:12px; - text-align:center; -} - -.calendar_date_select table { - margin: 0px; - padding: 0px; -} - - -.calendar_date_select .cds_header { - background-color: #ccc; - border-bottom: 2px solid #aaa; - text-align:center; -} - -.calendar_date_select .cds_header span { - font-size:15px; - color: black; - font-weight: bold; -} - -.calendar_date_select select { font-size:11px;} - -.calendar_date_select .cds_header a:hover { - color: white; -} -.calendar_date_select .cds_header a { - width:22px; - height:20px; - text-decoration: none; - font-size:14px; - color:black !important; -} - -.calendar_date_select .cds_header a.prev { - float:left; -} -.calendar_date_select .cds_header a.next { - float:right; -} -.calendar_date_select .cds_header a.close { - float:right; - display:none; -} - -.calendar_date_select .cds_header select.month { - width:90px; -} - -.calendar_date_select .cds_header select.year { - width:61px; -} - -.calendar_date_select .cds_buttons a { - color: white; - font-size: 9px; -} -.calendar_date_select td { - font-size:12px; - width: 24px; - height: 21px; - text-align:center; - vertical-align: middle; - background-color: #666666; -} -.calendar_date_select td.weekend { - background-color: #606060; -} - -.calendar_date_select td div { - color: #fff; -} -.calendar_date_select td div.other { - color: #888; -} -.calendar_date_select td.selected div { - color:black; -} - -.calendar_date_select tbody td { - border-bottom: 1px solid #555; -} -.calendar_date_select td.selected { - background-color:white; -} - -.calendar_date_select td:hover { - background-color:#ccc; -} - -.calendar_date_select td.today { - border: 1px dashed #999; -} - -.calendar_date_select td.disabled div { - color: #454545; -} - - -.fieldWithErrors .calendar_date_select { - border: 2px solid red; -} diff --git a/timcharper-calendar_date_select-d3b2b8c/spec/calendar_date_select/calendar_date_select_spec.rb b/timcharper-calendar_date_select-d3b2b8c/spec/calendar_date_select/calendar_date_select_spec.rb deleted file mode 100755 index a850211..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/spec/calendar_date_select/calendar_date_select_spec.rb +++ /dev/null @@ -1,14 +0,0 @@ -require File.dirname(__FILE__) + '/../spec_helper' - -describe CalendarDateSelect do - it "should detect presence of time in a string" do - CalendarDateSelect.has_time?("January 7, 2007").should == false - CalendarDateSelect.has_time?("January 7, 2007 5:50pm").should == true - CalendarDateSelect.has_time?("January 7, 2007 5:50 pm").should == true - CalendarDateSelect.has_time?("January 7, 2007 16:30 pm").should == true - - CalendarDateSelect.has_time?(Date.parse("January 7, 2007 3:00 pm")).should == false - CalendarDateSelect.has_time?(Time.parse("January 7, 2007 3:00 pm")).should == true - CalendarDateSelect.has_time?(DateTime.parse("January 7, 2007 3:00 pm")).should == true - end -end diff --git a/timcharper-calendar_date_select-d3b2b8c/spec/calendar_date_select/form_helpers_spec.rb b/timcharper-calendar_date_select-d3b2b8c/spec/calendar_date_select/form_helpers_spec.rb deleted file mode 100755 index a52d02e..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/spec/calendar_date_select/form_helpers_spec.rb +++ /dev/null @@ -1,189 +0,0 @@ -require File.dirname(__FILE__) + '/../spec_helper' - -describe CalendarDateSelect::FormHelpers do - include ActionView::Helpers::FormHelper - include ActionView::Helpers::JavaScriptHelper - include ActionView::Helpers::AssetTagHelper - include ActionView::Helpers::TagHelper - include ActionView::Helpers::FormTagHelper - - include CalendarDateSelect::FormHelpers - - before(:each) do - @controller = ActionController::Base.new - @request = OpenStruct.new - @controller.request = @request - - @model = OpenStruct.new - end - - describe "mixed mode" do - it "should not output a time when the value is a Date" do - @model.start_datetime = Date.parse("January 2, 2007") - output = calendar_date_select(:model, :start_datetime, :time => "mixed") - output.should_not match(/12:00 AM/) - end - - it "should output a time when the value is a Time" do - @model.start_datetime = Time.parse("January 2, 2007 12:00 AM") - output = calendar_date_select(:model, :start_datetime, :time => "mixed") - output.should match(/12:00 AM/) - end - end - - it "should render a time when time is passed as 'true'" do - @model.start_datetime = Date.parse("January 2, 2007") - output = calendar_date_select(:model, :start_datetime, :time => "true") - output.should match(/12:00 AM/) - end - - it "should time_false__model_returns_time__should_render_without_time" do - @model.start_datetime = Time.parse("January 2, 2007 12:00 AM") - output = calendar_date_select(:model, :start_datetime) - output.should_not match(/12:00 AM/) - end - - it "should _nil_model__shouldnt_populate_value" do - @model = nil - output = calendar_date_select(:model, :start_datetime) - - output.should_not match(/value/) - end - - describe "default time mode" do - it "should wrap default date in javascript function when passed as string" do - @model.start_datetime = nil - output = calendar_date_select(:model, :start_datetime, :default_time => "new Date()") - output.should match(/value=""/) - output.should include("default_time:function() { return new Date() }") - end - - it "should wrap formatted date with default time with Date() when passed a date object" do - @model.start_datetime = nil - output = calendar_date_select(:model, :start_datetime, :default_time => Date.parse("January 2, 2007")) - output.should match(/value=""/) - output.should include("default_time:new Date('January 02, 2007 12:00 AM')") - end - - it "should wrap formatted date and time with Date() when passed a time object" do - @model.start_datetime = nil - output = calendar_date_select(:model, :start_datetime, :default_time => Time.parse("January 2, 2007 5:45 PM")) - output.should match(/value=""/) - output.should include("default_time:new Date('January 02, 2007 05:45 PM')") - end - end - - it "should _vdc__should_auto_format_function" do - @model.start_datetime = Time.parse("January 2, 2007 12:00 AM") - output = calendar_date_select(:model, - :start_datetime, - :valid_date_check => "date < new Date()" - ) - output.should include("valid_date_check:function(date) { return(date < new Date()) }") - - output = calendar_date_select(:model, - :start_datetime, - :valid_date_check => "return(date < new Date())" - ) - output.should include("valid_date_check:function(date) { return(date < new Date()) }") - output = calendar_date_select(:model, - :start_datetime, - :valid_date_check => "function(p) { return(date < new Date()) }" - ) - output.should include("valid_date_check:function(p) { return(date < new Date()) }") - end - - it "should raise an error if the valid_date_check function is missing a return statement" do - message = ":valid_date_check function is missing a 'return' statement. Try something like: :valid_date_check => 'if (date > new(Date)) return true; else return false;'" - lambda { - output = calendar_date_select(:model, - :start_datetime, - :valid_date_check => "date = 5; date < new Date());" - ) - }.should raise_error(ArgumentError, message) - - lambda { - output = calendar_date_select(:model, - :start_datetime, - :valid_date_check => "function(p) { date = 5; date < new Date()); }" - ) - }.should raise_error(ArgumentError, message) - end - - it "should render the year_range argument correctly" do - output = calendar_date_select(:model, :start_datetime) - output.should include("year_range:10") - output = calendar_date_select(:model, :start_datetime, :year_range => 2000..2010) - output.should include("year_range:[2000, 2010]") - output = calendar_date_select(:model, :start_datetime, :year_range => (15.years.ago..5.years.ago)) - output.should include("year_range:[#{15.years.ago.year}, #{5.years.ago.year}]") - end - - it "should disregard the :object parameter when nil" do - @model.start_datetime = Time.parse("January 2, 2007 12:00 AM") - output = calendar_date_select(:model, :start_datetime, :time => true, :object => nil) - output.should include(CalendarDateSelect.format_date(@model.start_datetime)) - end - - it "should regard :object parameter" do - @model.start_datetime = Time.parse("January 2, 2007 12:00 AM") - output = calendar_date_select(:lame_o, :start_datetime, :time => true, :object => @model) - output.should include(CalendarDateSelect.format_date(@model.start_datetime)) - end - - it "should respect parameters provided in default_options" do - new_options = CalendarDateSelect.default_options.merge(:popup => "force") - CalendarDateSelect.stub!(:default_options).and_return(new_options) - calendar_date_select_tag(:name, "").should include("popup:'force'") - end - - it "should respect the :image option" do - output = calendar_date_select_tag(:name, "Some String", :image => "boogy.png") - output.should include("boogy.png") - end - - it "should not pass the :image option as a javascript option" do - output = calendar_date_select_tag(:name, "Some String", :image => "boogy.png") - output.should_not include("image:") - end - - it "should use the CSS class calendar_date_select_tag for popup selector icon" do - output = calendar_date_select_tag(:name, "Some String", :image => "boogy.png") - output.should include("calendar_date_select_popup_icon") - end - - describe "calendar_date_select_tag" do - before(:each) do - @time = Time.parse("January 2, 2007 12:01:23 AM") - end - - it "should use the string verbatim when provided" do - output = calendar_date_select_tag(:name, "Some String") - - output.should include("Some String") - end - - it "should not render the time when time is false (or nil)" do - output = calendar_date_select_tag(:name, @time, :time => false) - - output.should_not match(/12:01 AM/) - output.should include(CalendarDateSelect.format_date(@time.to_date)) - end - - it "should render the time when :time => true" do - output = calendar_date_select_tag(:name, @time, :time => true) - - output.should include(CalendarDateSelect.format_date(@time)) - end - - it "should render the time when :time => 'mixed'" do - output = calendar_date_select_tag(:name, @time, :time => 'mixed') - output.should include(CalendarDateSelect.format_date(@time)) - end - - it "not include the image option in the result input tag" do - output = calendar_date_select_tag(:name, @time, :time => 'mixed') - output.should_not include("image=") - end - end -end diff --git a/timcharper-calendar_date_select-d3b2b8c/spec/calendar_date_select/includes_helper_spec.rb b/timcharper-calendar_date_select-d3b2b8c/spec/calendar_date_select/includes_helper_spec.rb deleted file mode 100755 index 390c5b7..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/spec/calendar_date_select/includes_helper_spec.rb +++ /dev/null @@ -1,46 +0,0 @@ -require File.dirname(__FILE__) + '/../spec_helper' - -describe CalendarDateSelect::IncludesHelper do - include ActionView::Helpers::TagHelper - include ActionView::Helpers::AssetTagHelper - include CalendarDateSelect::IncludesHelper - - describe "calendar_date_select_includes" do - it "should include the specified locale" do - calendar_date_select_includes(:locale => "fr").should include("calendar_date_select/locale/fr.js") - end - - it "should include the specified style" do - calendar_date_select_includes(:style => "blue").should include("calendar_date_select/blue.css") - end - - it "should complain if you provide an illegitimate argument" do - lambda { calendar_date_select_includes(:language => "fr") }.should raise_error(ArgumentError) - end - end - - describe "calendar_date_select_javascripts" do - it "should return an array of javascripts" do - calendar_date_select_javascripts.should == ["calendar_date_select/calendar_date_select"] - end - - it "should return the :javascript_include of the specified format, if the specified format expects it" do - CalendarDateSelect.stub!(:format).and_return(CalendarDateSelect::FORMATS[:hyphen_ampm]) - calendar_date_select_javascripts.should == ["calendar_date_select/calendar_date_select", "calendar_date_select/format_hyphen_ampm"] - end - - it "should blow up if an illegitimate argument is passed" do - lambda { calendar_date_select_javascripts(:language => "fr") }.should raise_error(ArgumentError) - end - end - - describe "calendar_date_select_stylesheets" do - it "should return an array of stylesheet" do - calendar_date_select_javascripts.should == ["calendar_date_select/calendar_date_select"] - end - - it "should blow up if an illegitimate argument is passed" do - lambda { calendar_date_select_stylesheets(:css_version => "blue") }.should raise_error(ArgumentError) - end - end -end diff --git a/timcharper-calendar_date_select-d3b2b8c/spec/spec_helper.rb b/timcharper-calendar_date_select-d3b2b8c/spec/spec_helper.rb deleted file mode 100755 index 2006c5c..0000000 --- a/timcharper-calendar_date_select-d3b2b8c/spec/spec_helper.rb +++ /dev/null @@ -1,26 +0,0 @@ -require "rubygems" - -require 'spec' - -gem 'activesupport', "2.3.4" -gem 'actionpack', ">= 2.2.0" - -require 'active_support' -require 'action_pack' -require 'action_controller' -require 'action_view' - -require 'ostruct' - -ActionView::Helpers::InstanceTag.class_eval do - class << self; alias new_with_backwards_compatibility new; end -end - -$: << (File.dirname(__FILE__) + "/../lib") -require "calendar_date_select" - -class String - def to_regexp - is_a?(Regexp) ? self : Regexp.new(Regexp.escape(self.to_s)) - end -end \ No newline at end of file