spree_essentials 0.1.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/LICENSE +23 -0
  2. data/README.md +187 -0
  3. data/Rakefile +40 -0
  4. data/app/controllers/admin/markdown_controller.rb +7 -0
  5. data/app/controllers/admin/resource_controller.rb +222 -0
  6. data/app/controllers/admin/uploads_controller.rb +34 -0
  7. data/app/helpers/admin/base_helper_decorator.rb +18 -0
  8. data/app/models/image_decorator.rb +7 -0
  9. data/app/models/upload.rb +46 -0
  10. data/app/validators/datetime_validator.rb +6 -0
  11. data/app/views/admin/shared/_contents_sub_menu.html.erb +11 -0
  12. data/app/views/admin/shared/_contents_tab.html.erb +2 -0
  13. data/app/views/admin/uploads/_form.html.erb +8 -0
  14. data/app/views/admin/uploads/edit.html.erb +18 -0
  15. data/app/views/admin/uploads/index.html.erb +50 -0
  16. data/app/views/admin/uploads/new.html.erb +21 -0
  17. data/app/views/admin/uploads/picker.html.erb +11 -0
  18. data/config/locales/en.yml +79 -0
  19. data/config/routes.rb +10 -0
  20. data/lib/generators/essentials_base.rb +23 -0
  21. data/lib/generators/spree_essentials/install_generator.rb +16 -0
  22. data/lib/generators/templates/db/migrate/add_attachment_file_size_to_assets.rb +9 -0
  23. data/lib/spree_core/action_callbacks.rb +26 -0
  24. data/lib/spree_essentials/test_helper.rb +21 -0
  25. data/lib/spree_essentials/version.rb +3 -0
  26. data/lib/spree_essentials.rb +52 -0
  27. data/public/images/admin/icons/pages.png +0 -0
  28. data/public/images/blog/rss.png +0 -0
  29. data/public/images/markitup/bg-container.png +0 -0
  30. data/public/images/markitup/bg-editor.png +0 -0
  31. data/public/images/markitup/bg-picker.png +0 -0
  32. data/public/images/markitup/bold.png +0 -0
  33. data/public/images/markitup/code.png +0 -0
  34. data/public/images/markitup/h1.png +0 -0
  35. data/public/images/markitup/h2.png +0 -0
  36. data/public/images/markitup/h3.png +0 -0
  37. data/public/images/markitup/h4.png +0 -0
  38. data/public/images/markitup/h5.png +0 -0
  39. data/public/images/markitup/h6.png +0 -0
  40. data/public/images/markitup/handle.png +0 -0
  41. data/public/images/markitup/image-picker.png +0 -0
  42. data/public/images/markitup/italic.png +0 -0
  43. data/public/images/markitup/link.png +0 -0
  44. data/public/images/markitup/list-bullet.png +0 -0
  45. data/public/images/markitup/list-numeric.png +0 -0
  46. data/public/images/markitup/menu.png +0 -0
  47. data/public/images/markitup/more-tag.png +0 -0
  48. data/public/images/markitup/picture.png +0 -0
  49. data/public/images/markitup/preview.png +0 -0
  50. data/public/images/markitup/quotes.png +0 -0
  51. data/public/images/markitup/submenu.png +0 -0
  52. data/public/javascripts/date.js +145 -0
  53. data/public/javascripts/jquery.autodate.js +112 -0
  54. data/public/javascripts/jquery.markitup.js +574 -0
  55. data/public/javascripts/markdown.set.js +95 -0
  56. data/public/stylesheets/essentials.css +35 -0
  57. data/public/stylesheets/markitup.css +278 -0
  58. metadata +245 -0
@@ -0,0 +1,21 @@
1
+ <h3><%= t('.new_upload') %></h3>
2
+
3
+ <% form_for(@upload, :url => admin_uploads_path, :html => { :multipart => true }) do |form| %>
4
+ <table class="basic-table">
5
+ <%= render "form", :form => form %>
6
+ </table>
7
+ <p class="form-buttons">
8
+ <%= button t("create") %>
9
+ or <%= link_to t("cancel"), "#", :id => "cancel_link" %>
10
+ </p>
11
+ <% end %>
12
+
13
+ <script type="text/javascript">
14
+ jQuery('#cancel_link').click(function (event) {
15
+ jQuery('#new_image_link').show();
16
+ jQuery('#images').html('');
17
+ });
18
+ </script>
19
+
20
+
21
+
@@ -0,0 +1,11 @@
1
+ <ul class="picker">
2
+ <% @uploads.each do |upload| %>
3
+ <li>
4
+ <% if upload.image_content? %>
5
+ <%= link_to image_tag(upload.attachment.url(:mini)), upload.attachment.url(:original), :class => 'option image' %>
6
+ <% else %>
7
+ <%= link_to upload.attachment_file_name, upload.attachment.url(:original), :class => 'option file' %>
8
+ <% end %>
9
+ </li>
10
+ <% end %>
11
+ </ul>
@@ -0,0 +1,79 @@
1
+ en:
2
+
3
+ successfully_created: Successfully created
4
+ successfully_updated: Successfully updated
5
+ successfully_destroyed: Successfully destroyed
6
+
7
+ essentials:
8
+ parsed_with: Parsed With
9
+
10
+ activerecord:
11
+ errors:
12
+ messages:
13
+ invalid_date_time: is an invalid date.
14
+
15
+ upload:
16
+ file_name: File Name
17
+ size: Size
18
+
19
+ page:
20
+ contents: Contents
21
+ title: Title
22
+ nav_title: Navigation Title
23
+ path: Path
24
+ meta_title: Meta Title
25
+ meta_description: Meta Description
26
+ meta_keywords: Meta Keywords
27
+ accessible: Accessible
28
+ visible: Visible
29
+ explain_accessible: non-accessible pages must be coded into a custom controller.
30
+ explain_visible: visible pages will show up in the main menu.
31
+
32
+ content:
33
+ page_title: Page Title
34
+ page: Page
35
+ title: Title
36
+ body: Body
37
+ attachment: Attachment
38
+ link: Link URL
39
+ link_text: Link Text
40
+ context: Context
41
+ hide_title: Hide Title
42
+
43
+ pages: Pages
44
+
45
+ admin:
46
+ subnav:
47
+ pages: Pages
48
+ uploads: Uploads
49
+ shared:
50
+ contents_tab:
51
+ content: Content
52
+ page_tabs:
53
+ editing_page: Editing Page
54
+ page_details: Page Details
55
+ contents: Contents
56
+ images: Images
57
+ pages:
58
+ index:
59
+ title: Title
60
+ listing_pages: Listing Pages
61
+ new_page: New Page
62
+ title_contains: Title
63
+ new:
64
+ new_page: New Page
65
+
66
+ contents:
67
+ index:
68
+ new_content: New Content
69
+ listing_contents: Listing Contents
70
+ new:
71
+ new_content: New Content
72
+ edit:
73
+ edit_content: Edit Content
74
+
75
+ uploads:
76
+ new:
77
+ new_upload: New Upload
78
+ index:
79
+ new_upload: Upload a file
data/config/routes.rb ADDED
@@ -0,0 +1,10 @@
1
+ Rails.application.routes.draw do
2
+
3
+ namespace :admin do
4
+
5
+ post "/markdown/preview" => "markdown#preview"
6
+ resources :uploads
7
+
8
+ end
9
+
10
+ end
@@ -0,0 +1,23 @@
1
+ module SpreeEssentials
2
+ module Generators
3
+ class EssentialsBase < Rails::Generators::Base
4
+
5
+ include Rails::Generators::Migration
6
+
7
+ def self.count!
8
+ @count ||= 0
9
+ (@count += 1) * 3
10
+ end
11
+
12
+ def self.next_migration_number(path)
13
+ @time ||= Time.new.utc
14
+ if ActiveRecord::Base.timestamped_migrations
15
+ (@time + self.count!).strftime("%Y%m%d%H%M%S")
16
+ else
17
+ "%.3d" % (current_migration_number(dirname) + 1)
18
+ end
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ require 'generators/essentials_base'
2
+
3
+ module SpreeEssentials
4
+ module Generators
5
+ class InstallGenerator < SpreeEssentials::Generators::EssentialsBase
6
+
7
+ desc "Installs required migrations for spree_essentials"
8
+ source_root File.expand_path("../../templates/db/migrate", __FILE__)
9
+
10
+ def copy_migrations
11
+ migration_template "add_attachment_file_size_to_assets.rb", "db/migrate/add_attachment_file_size_to_assets.rb"
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ class AddAttachmentFileSizeToAssets < ActiveRecord::Migration
2
+ def self.up
3
+ add_column :assets, :attachment_file_size, :integer
4
+ end
5
+
6
+ def self.down
7
+ remove_column :assets, :attachment_file_size
8
+ end
9
+ end
@@ -0,0 +1,26 @@
1
+ module Spree
2
+ class ActionCallbacks
3
+ attr_reader :before_methods
4
+ attr_reader :after_methods
5
+ attr_reader :fails_methods
6
+
7
+ def initialize
8
+ @before_methods = []
9
+ @after_methods = []
10
+ @fails_methods = []
11
+ end
12
+
13
+ def before(method)
14
+ @before_methods << method
15
+ end
16
+
17
+ def after(method)
18
+ @after_methods << method
19
+ end
20
+
21
+ def fails(method)
22
+ @fails_methods << method
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,21 @@
1
+ require 'rails/test_help'
2
+ require 'shoulda'
3
+ require 'factory_girl'
4
+ require 'sqlite3'
5
+ require 'faker'
6
+
7
+ ActionMailer::Base.delivery_method = :test
8
+ ActionMailer::Base.perform_deliveries = true
9
+ ActionMailer::Base.default_url_options[:host] = "example.com"
10
+
11
+ Rails.backtrace_cleaner.remove_silencers!
12
+
13
+ # Configure capybara for integration testing
14
+ require "capybara/rails"
15
+ require "selenium/webdriver"
16
+
17
+ Capybara.default_driver = :selenium
18
+
19
+ class ActionController::TestCase
20
+ include Devise::TestHelpers
21
+ end
@@ -0,0 +1,3 @@
1
+ module SpreeEssentials
2
+ VERSION = "0.1.0.pre"
3
+ end
@@ -0,0 +1,52 @@
1
+ require 'spree_core'
2
+ require 'spree_auth'
3
+ require 'rdiscount'
4
+
5
+ module SpreeEssentials
6
+
7
+ class << self
8
+
9
+ # Stores an essential-aware extension for use later
10
+ def register(key, extension)
11
+ essentials[:key] = extension
12
+ end
13
+
14
+ # Looks up an extension name
15
+ def has?(essential)
16
+ essentials.keys.include?(essential.to_sym)
17
+ end
18
+
19
+ # Returns the array of essential-aware extensions
20
+ def essentials
21
+ @essentials ||= {}
22
+ end
23
+
24
+ end
25
+
26
+ class Engine < Rails::Engine
27
+
28
+ config.autoload_paths += %W(#{config.root}/lib)
29
+
30
+ initializer "static assets" do |app|
31
+ app.middleware.insert_before ::Rack::Lock, ::ActionDispatch::Static, "#{config.root}/public"
32
+ end
33
+
34
+ def self.activate
35
+
36
+ Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator.rb")) do |c|
37
+ Rails.env.production? ? require(c) : load(c)
38
+ end
39
+
40
+ end
41
+
42
+ config.to_prepare &method(:activate).to_proc
43
+
44
+ end
45
+
46
+ class CustomHooks < Spree::ThemeSupport::HookListener
47
+
48
+ insert_after :admin_tabs, 'admin/shared/contents_tab'
49
+
50
+ end
51
+
52
+ end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,145 @@
1
+ /**
2
+ * @version: 1.0 Alpha-1
3
+ * @author: Coolite Inc. http://www.coolite.com/
4
+ * @date: 2008-05-13
5
+ * @copyright: Copyright (c) 2006-2008, Coolite Inc. (http://www.coolite.com/). All rights reserved.
6
+ * @license: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/.
7
+ * @website: http://www.datejs.com/
8
+ */
9
+ Date.CultureInfo={name:"en-US",englishName:"English (United States)",nativeName:"English (United States)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"M/d/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\+|aft(er)?|from|hence)/i,subtract:/^(\-|bef(ore)?|ago)/i,yesterday:/^yes(terday)?/i,today:/^t(od(ay)?)?/i,tomorrow:/^tom(orrow)?/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^mn|min(ute)?s?/i,hour:/^h(our)?s?/i,week:/^w(eek)?s?/i,month:/^m(onth)?s?/i,day:/^d(ay)?s?/i,year:/^y(ear)?s?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\.?m?\.?|p\.?m?\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\s*(\+|\-)\s*\d\d\d\d?)|gmt|utc)/i,ordinalSuffix:/^\s*(st|nd|rd|th)/i,timeContext:/^\s*(\:|a(?!u|p)|p)/i},timezones:[{name:"UTC",offset:"-000"},{name:"GMT",offset:"-000"},{name:"EST",offset:"-0500"},{name:"EDT",offset:"-0400"},{name:"CST",offset:"-0600"},{name:"CDT",offset:"-0500"},{name:"MST",offset:"-0700"},{name:"MDT",offset:"-0600"},{name:"PST",offset:"-0800"},{name:"PDT",offset:"-0700"}]};
10
+ (function(){var $D=Date,$P=$D.prototype,$C=$D.CultureInfo,p=function(s,l){if(!l){l=2;}
11
+ return("000"+s).slice(l*-1);};$P.clearTime=function(){this.setHours(0);this.setMinutes(0);this.setSeconds(0);this.setMilliseconds(0);return this;};$P.setTimeToNow=function(){var n=new Date();this.setHours(n.getHours());this.setMinutes(n.getMinutes());this.setSeconds(n.getSeconds());this.setMilliseconds(n.getMilliseconds());return this;};$D.today=function(){return new Date().clearTime();};$D.compare=function(date1,date2){if(isNaN(date1)||isNaN(date2)){throw new Error(date1+" - "+date2);}else if(date1 instanceof Date&&date2 instanceof Date){return(date1<date2)?-1:(date1>date2)?1:0;}else{throw new TypeError(date1+" - "+date2);}};$D.equals=function(date1,date2){return(date1.compareTo(date2)===0);};$D.getDayNumberFromName=function(name){var n=$C.dayNames,m=$C.abbreviatedDayNames,o=$C.shortestDayNames,s=name.toLowerCase();for(var i=0;i<n.length;i++){if(n[i].toLowerCase()==s||m[i].toLowerCase()==s||o[i].toLowerCase()==s){return i;}}
12
+ return-1;};$D.getMonthNumberFromName=function(name){var n=$C.monthNames,m=$C.abbreviatedMonthNames,s=name.toLowerCase();for(var i=0;i<n.length;i++){if(n[i].toLowerCase()==s||m[i].toLowerCase()==s){return i;}}
13
+ return-1;};$D.isLeapYear=function(year){return((year%4===0&&year%100!==0)||year%400===0);};$D.getDaysInMonth=function(year,month){return[31,($D.isLeapYear(year)?29:28),31,30,31,30,31,31,30,31,30,31][month];};$D.getTimezoneAbbreviation=function(offset){var z=$C.timezones,p;for(var i=0;i<z.length;i++){if(z[i].offset===offset){return z[i].name;}}
14
+ return null;};$D.getTimezoneOffset=function(name){var z=$C.timezones,p;for(var i=0;i<z.length;i++){if(z[i].name===name.toUpperCase()){return z[i].offset;}}
15
+ return null;};$P.clone=function(){return new Date(this.getTime());};$P.compareTo=function(date){return Date.compare(this,date);};$P.equals=function(date){return Date.equals(this,date||new Date());};$P.between=function(start,end){return this.getTime()>=start.getTime()&&this.getTime()<=end.getTime();};$P.isAfter=function(date){return this.compareTo(date||new Date())===1;};$P.isBefore=function(date){return(this.compareTo(date||new Date())===-1);};$P.isToday=function(){return this.isSameDay(new Date());};$P.isSameDay=function(date){return this.clone().clearTime().equals(date.clone().clearTime());};$P.addMilliseconds=function(value){this.setMilliseconds(this.getMilliseconds()+value);return this;};$P.addSeconds=function(value){return this.addMilliseconds(value*1000);};$P.addMinutes=function(value){return this.addMilliseconds(value*60000);};$P.addHours=function(value){return this.addMilliseconds(value*3600000);};$P.addDays=function(value){this.setDate(this.getDate()+value);return this;};$P.addWeeks=function(value){return this.addDays(value*7);};$P.addMonths=function(value){var n=this.getDate();this.setDate(1);this.setMonth(this.getMonth()+value);this.setDate(Math.min(n,$D.getDaysInMonth(this.getFullYear(),this.getMonth())));return this;};$P.addYears=function(value){return this.addMonths(value*12);};$P.add=function(config){if(typeof config=="number"){this._orient=config;return this;}
16
+ var x=config;if(x.milliseconds){this.addMilliseconds(x.milliseconds);}
17
+ if(x.seconds){this.addSeconds(x.seconds);}
18
+ if(x.minutes){this.addMinutes(x.minutes);}
19
+ if(x.hours){this.addHours(x.hours);}
20
+ if(x.weeks){this.addWeeks(x.weeks);}
21
+ if(x.months){this.addMonths(x.months);}
22
+ if(x.years){this.addYears(x.years);}
23
+ if(x.days){this.addDays(x.days);}
24
+ return this;};var $y,$m,$d;$P.getWeek=function(){var a,b,c,d,e,f,g,n,s,w;$y=(!$y)?this.getFullYear():$y;$m=(!$m)?this.getMonth()+1:$m;$d=(!$d)?this.getDate():$d;if($m<=2){a=$y-1;b=(a/4|0)-(a/100|0)+(a/400|0);c=((a-1)/4|0)-((a-1)/100|0)+((a-1)/400|0);s=b-c;e=0;f=$d-1+(31*($m-1));}else{a=$y;b=(a/4|0)-(a/100|0)+(a/400|0);c=((a-1)/4|0)-((a-1)/100|0)+((a-1)/400|0);s=b-c;e=s+1;f=$d+((153*($m-3)+2)/5)+58+s;}
25
+ g=(a+b)%7;d=(f+g-e)%7;n=(f+3-d)|0;if(n<0){w=53-((g-s)/5|0);}else if(n>364+s){w=1;}else{w=(n/7|0)+1;}
26
+ $y=$m=$d=null;return w;};$P.getISOWeek=function(){$y=this.getUTCFullYear();$m=this.getUTCMonth()+1;$d=this.getUTCDate();return p(this.getWeek());};$P.setWeek=function(n){return this.moveToDayOfWeek(1).addWeeks(n-this.getWeek());};$D._validate=function(n,min,max,name){if(typeof n=="undefined"){return false;}else if(typeof n!="number"){throw new TypeError(n+" is not a Number.");}else if(n<min||n>max){throw new RangeError(n+" is not a valid value for "+name+".");}
27
+ return true;};$D.validateMillisecond=function(value){return $D._validate(value,0,999,"millisecond");};$D.validateSecond=function(value){return $D._validate(value,0,59,"second");};$D.validateMinute=function(value){return $D._validate(value,0,59,"minute");};$D.validateHour=function(value){return $D._validate(value,0,23,"hour");};$D.validateDay=function(value,year,month){return $D._validate(value,1,$D.getDaysInMonth(year,month),"day");};$D.validateMonth=function(value){return $D._validate(value,0,11,"month");};$D.validateYear=function(value){return $D._validate(value,0,9999,"year");};$P.set=function(config){if($D.validateMillisecond(config.millisecond)){this.addMilliseconds(config.millisecond-this.getMilliseconds());}
28
+ if($D.validateSecond(config.second)){this.addSeconds(config.second-this.getSeconds());}
29
+ if($D.validateMinute(config.minute)){this.addMinutes(config.minute-this.getMinutes());}
30
+ if($D.validateHour(config.hour)){this.addHours(config.hour-this.getHours());}
31
+ if($D.validateMonth(config.month)){this.addMonths(config.month-this.getMonth());}
32
+ if($D.validateYear(config.year)){this.addYears(config.year-this.getFullYear());}
33
+ if($D.validateDay(config.day,this.getFullYear(),this.getMonth())){this.addDays(config.day-this.getDate());}
34
+ if(config.timezone){this.setTimezone(config.timezone);}
35
+ if(config.timezoneOffset){this.setTimezoneOffset(config.timezoneOffset);}
36
+ if(config.week&&$D._validate(config.week,0,53,"week")){this.setWeek(config.week);}
37
+ return this;};$P.moveToFirstDayOfMonth=function(){return this.set({day:1});};$P.moveToLastDayOfMonth=function(){return this.set({day:$D.getDaysInMonth(this.getFullYear(),this.getMonth())});};$P.moveToNthOccurrence=function(dayOfWeek,occurrence){var shift=0;if(occurrence>0){shift=occurrence-1;}
38
+ else if(occurrence===-1){this.moveToLastDayOfMonth();if(this.getDay()!==dayOfWeek){this.moveToDayOfWeek(dayOfWeek,-1);}
39
+ return this;}
40
+ return this.moveToFirstDayOfMonth().addDays(-1).moveToDayOfWeek(dayOfWeek,+1).addWeeks(shift);};$P.moveToDayOfWeek=function(dayOfWeek,orient){var diff=(dayOfWeek-this.getDay()+7*(orient||+1))%7;return this.addDays((diff===0)?diff+=7*(orient||+1):diff);};$P.moveToMonth=function(month,orient){var diff=(month-this.getMonth()+12*(orient||+1))%12;return this.addMonths((diff===0)?diff+=12*(orient||+1):diff);};$P.getOrdinalNumber=function(){return Math.ceil((this.clone().clearTime()-new Date(this.getFullYear(),0,1))/86400000)+1;};$P.getTimezone=function(){return $D.getTimezoneAbbreviation(this.getUTCOffset());};$P.setTimezoneOffset=function(offset){var here=this.getTimezoneOffset(),there=Number(offset)*-6/10;return this.addMinutes(there-here);};$P.setTimezone=function(offset){return this.setTimezoneOffset($D.getTimezoneOffset(offset));};$P.hasDaylightSavingTime=function(){return(Date.today().set({month:0,day:1}).getTimezoneOffset()!==Date.today().set({month:6,day:1}).getTimezoneOffset());};$P.isDaylightSavingTime=function(){return(this.hasDaylightSavingTime()&&new Date().getTimezoneOffset()===Date.today().set({month:6,day:1}).getTimezoneOffset());};$P.getUTCOffset=function(){var n=this.getTimezoneOffset()*-10/6,r;if(n<0){r=(n-10000).toString();return r.charAt(0)+r.substr(2);}else{r=(n+10000).toString();return"+"+r.substr(1);}};$P.getElapsed=function(date){return(date||new Date())-this;};if(!$P.toISOString){$P.toISOString=function(){function f(n){return n<10?'0'+n:n;}
41
+ return'"'+this.getUTCFullYear()+'-'+
42
+ f(this.getUTCMonth()+1)+'-'+
43
+ f(this.getUTCDate())+'T'+
44
+ f(this.getUTCHours())+':'+
45
+ f(this.getUTCMinutes())+':'+
46
+ f(this.getUTCSeconds())+'Z"';};}
47
+ $P._toString=$P.toString;$P.toString=function(format){var x=this;if(format&&format.length==1){var c=$C.formatPatterns;x.t=x.toString;switch(format){case"d":return x.t(c.shortDate);case"D":return x.t(c.longDate);case"F":return x.t(c.fullDateTime);case"m":return x.t(c.monthDay);case"r":return x.t(c.rfc1123);case"s":return x.t(c.sortableDateTime);case"t":return x.t(c.shortTime);case"T":return x.t(c.longTime);case"u":return x.t(c.universalSortableDateTime);case"y":return x.t(c.yearMonth);}}
48
+ var ord=function(n){switch(n*1){case 1:case 21:case 31:return"st";case 2:case 22:return"nd";case 3:case 23:return"rd";default:return"th";}};return format?format.replace(/(\\)?(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|S)/g,function(m){if(m.charAt(0)==="\\"){return m.replace("\\","");}
49
+ x.h=x.getHours;switch(m){case"hh":return p(x.h()<13?(x.h()===0?12:x.h()):(x.h()-12));case"h":return x.h()<13?(x.h()===0?12:x.h()):(x.h()-12);case"HH":return p(x.h());case"H":return x.h();case"mm":return p(x.getMinutes());case"m":return x.getMinutes();case"ss":return p(x.getSeconds());case"s":return x.getSeconds();case"yyyy":return p(x.getFullYear(),4);case"yy":return p(x.getFullYear());case"dddd":return $C.dayNames[x.getDay()];case"ddd":return $C.abbreviatedDayNames[x.getDay()];case"dd":return p(x.getDate());case"d":return x.getDate();case"MMMM":return $C.monthNames[x.getMonth()];case"MMM":return $C.abbreviatedMonthNames[x.getMonth()];case"MM":return p((x.getMonth()+1));case"M":return x.getMonth()+1;case"t":return x.h()<12?$C.amDesignator.substring(0,1):$C.pmDesignator.substring(0,1);case"tt":return x.h()<12?$C.amDesignator:$C.pmDesignator;case"S":return ord(x.getDate());default:return m;}}):this._toString();};}());
50
+ (function(){var $D=Date,$P=$D.prototype,$C=$D.CultureInfo,$N=Number.prototype;$P._orient=+1;$P._nth=null;$P._is=false;$P._same=false;$P._isSecond=false;$N._dateElement="day";$P.next=function(){this._orient=+1;return this;};$D.next=function(){return $D.today().next();};$P.last=$P.prev=$P.previous=function(){this._orient=-1;return this;};$D.last=$D.prev=$D.previous=function(){return $D.today().last();};$P.is=function(){this._is=true;return this;};$P.same=function(){this._same=true;this._isSecond=false;return this;};$P.today=function(){return this.same().day();};$P.weekday=function(){if(this._is){this._is=false;return(!this.is().sat()&&!this.is().sun());}
51
+ return false;};$P.at=function(time){return(typeof time==="string")?$D.parse(this.toString("d")+" "+time):this.set(time);};$N.fromNow=$N.after=function(date){var c={};c[this._dateElement]=this;return((!date)?new Date():date.clone()).add(c);};$N.ago=$N.before=function(date){var c={};c[this._dateElement]=this*-1;return((!date)?new Date():date.clone()).add(c);};var dx=("sunday monday tuesday wednesday thursday friday saturday").split(/\s/),mx=("january february march april may june july august september october november december").split(/\s/),px=("Millisecond Second Minute Hour Day Week Month Year").split(/\s/),pxf=("Milliseconds Seconds Minutes Hours Date Week Month FullYear").split(/\s/),nth=("final first second third fourth fifth").split(/\s/),de;$P.toObject=function(){var o={};for(var i=0;i<px.length;i++){o[px[i].toLowerCase()]=this["get"+pxf[i]]();}
52
+ return o;};$D.fromObject=function(config){config.week=null;return Date.today().set(config);};var df=function(n){return function(){if(this._is){this._is=false;return this.getDay()==n;}
53
+ if(this._nth!==null){if(this._isSecond){this.addSeconds(this._orient*-1);}
54
+ this._isSecond=false;var ntemp=this._nth;this._nth=null;var temp=this.clone().moveToLastDayOfMonth();this.moveToNthOccurrence(n,ntemp);if(this>temp){throw new RangeError($D.getDayName(n)+" does not occur "+ntemp+" times in the month of "+$D.getMonthName(temp.getMonth())+" "+temp.getFullYear()+".");}
55
+ return this;}
56
+ return this.moveToDayOfWeek(n,this._orient);};};var sdf=function(n){return function(){var t=$D.today(),shift=n-t.getDay();if(n===0&&$C.firstDayOfWeek===1&&t.getDay()!==0){shift=shift+7;}
57
+ return t.addDays(shift);};};for(var i=0;i<dx.length;i++){$D[dx[i].toUpperCase()]=$D[dx[i].toUpperCase().substring(0,3)]=i;$D[dx[i]]=$D[dx[i].substring(0,3)]=sdf(i);$P[dx[i]]=$P[dx[i].substring(0,3)]=df(i);}
58
+ var mf=function(n){return function(){if(this._is){this._is=false;return this.getMonth()===n;}
59
+ return this.moveToMonth(n,this._orient);};};var smf=function(n){return function(){return $D.today().set({month:n,day:1});};};for(var j=0;j<mx.length;j++){$D[mx[j].toUpperCase()]=$D[mx[j].toUpperCase().substring(0,3)]=j;$D[mx[j]]=$D[mx[j].substring(0,3)]=smf(j);$P[mx[j]]=$P[mx[j].substring(0,3)]=mf(j);}
60
+ var ef=function(j){return function(){if(this._isSecond){this._isSecond=false;return this;}
61
+ if(this._same){this._same=this._is=false;var o1=this.toObject(),o2=(arguments[0]||new Date()).toObject(),v="",k=j.toLowerCase();for(var m=(px.length-1);m>-1;m--){v=px[m].toLowerCase();if(o1[v]!=o2[v]){return false;}
62
+ if(k==v){break;}}
63
+ return true;}
64
+ if(j.substring(j.length-1)!="s"){j+="s";}
65
+ return this["add"+j](this._orient);};};var nf=function(n){return function(){this._dateElement=n;return this;};};for(var k=0;k<px.length;k++){de=px[k].toLowerCase();$P[de]=$P[de+"s"]=ef(px[k]);$N[de]=$N[de+"s"]=nf(de);}
66
+ $P._ss=ef("Second");var nthfn=function(n){return function(dayOfWeek){if(this._same){return this._ss(arguments[0]);}
67
+ if(dayOfWeek||dayOfWeek===0){return this.moveToNthOccurrence(dayOfWeek,n);}
68
+ this._nth=n;if(n===2&&(dayOfWeek===undefined||dayOfWeek===null)){this._isSecond=true;return this.addSeconds(this._orient);}
69
+ return this;};};for(var l=0;l<nth.length;l++){$P[nth[l]]=(l===0)?nthfn(-1):nthfn(l);}}());
70
+ (function(){Date.Parsing={Exception:function(s){this.message="Parse error at '"+s.substring(0,10)+" ...'";}};var $P=Date.Parsing;var _=$P.Operators={rtoken:function(r){return function(s){var mx=s.match(r);if(mx){return([mx[0],s.substring(mx[0].length)]);}else{throw new $P.Exception(s);}};},token:function(s){return function(s){return _.rtoken(new RegExp("^\s*"+s+"\s*"))(s);};},stoken:function(s){return _.rtoken(new RegExp("^"+s));},until:function(p){return function(s){var qx=[],rx=null;while(s.length){try{rx=p.call(this,s);}catch(e){qx.push(rx[0]);s=rx[1];continue;}
71
+ break;}
72
+ return[qx,s];};},many:function(p){return function(s){var rx=[],r=null;while(s.length){try{r=p.call(this,s);}catch(e){return[rx,s];}
73
+ rx.push(r[0]);s=r[1];}
74
+ return[rx,s];};},optional:function(p){return function(s){var r=null;try{r=p.call(this,s);}catch(e){return[null,s];}
75
+ return[r[0],r[1]];};},not:function(p){return function(s){try{p.call(this,s);}catch(e){return[null,s];}
76
+ throw new $P.Exception(s);};},ignore:function(p){return p?function(s){var r=null;r=p.call(this,s);return[null,r[1]];}:null;},product:function(){var px=arguments[0],qx=Array.prototype.slice.call(arguments,1),rx=[];for(var i=0;i<px.length;i++){rx.push(_.each(px[i],qx));}
77
+ return rx;},cache:function(rule){var cache={},r=null;return function(s){try{r=cache[s]=(cache[s]||rule.call(this,s));}catch(e){r=cache[s]=e;}
78
+ if(r instanceof $P.Exception){throw r;}else{return r;}};},any:function(){var px=arguments;return function(s){var r=null;for(var i=0;i<px.length;i++){if(px[i]==null){continue;}
79
+ try{r=(px[i].call(this,s));}catch(e){r=null;}
80
+ if(r){return r;}}
81
+ throw new $P.Exception(s);};},each:function(){var px=arguments;return function(s){var rx=[],r=null;for(var i=0;i<px.length;i++){if(px[i]==null){continue;}
82
+ try{r=(px[i].call(this,s));}catch(e){throw new $P.Exception(s);}
83
+ rx.push(r[0]);s=r[1];}
84
+ return[rx,s];};},all:function(){var px=arguments,_=_;return _.each(_.optional(px));},sequence:function(px,d,c){d=d||_.rtoken(/^\s*/);c=c||null;if(px.length==1){return px[0];}
85
+ return function(s){var r=null,q=null;var rx=[];for(var i=0;i<px.length;i++){try{r=px[i].call(this,s);}catch(e){break;}
86
+ rx.push(r[0]);try{q=d.call(this,r[1]);}catch(ex){q=null;break;}
87
+ s=q[1];}
88
+ if(!r){throw new $P.Exception(s);}
89
+ if(q){throw new $P.Exception(q[1]);}
90
+ if(c){try{r=c.call(this,r[1]);}catch(ey){throw new $P.Exception(r[1]);}}
91
+ return[rx,(r?r[1]:s)];};},between:function(d1,p,d2){d2=d2||d1;var _fn=_.each(_.ignore(d1),p,_.ignore(d2));return function(s){var rx=_fn.call(this,s);return[[rx[0][0],r[0][2]],rx[1]];};},list:function(p,d,c){d=d||_.rtoken(/^\s*/);c=c||null;return(p instanceof Array?_.each(_.product(p.slice(0,-1),_.ignore(d)),p.slice(-1),_.ignore(c)):_.each(_.many(_.each(p,_.ignore(d))),px,_.ignore(c)));},set:function(px,d,c){d=d||_.rtoken(/^\s*/);c=c||null;return function(s){var r=null,p=null,q=null,rx=null,best=[[],s],last=false;for(var i=0;i<px.length;i++){q=null;p=null;r=null;last=(px.length==1);try{r=px[i].call(this,s);}catch(e){continue;}
92
+ rx=[[r[0]],r[1]];if(r[1].length>0&&!last){try{q=d.call(this,r[1]);}catch(ex){last=true;}}else{last=true;}
93
+ if(!last&&q[1].length===0){last=true;}
94
+ if(!last){var qx=[];for(var j=0;j<px.length;j++){if(i!=j){qx.push(px[j]);}}
95
+ p=_.set(qx,d).call(this,q[1]);if(p[0].length>0){rx[0]=rx[0].concat(p[0]);rx[1]=p[1];}}
96
+ if(rx[1].length<best[1].length){best=rx;}
97
+ if(best[1].length===0){break;}}
98
+ if(best[0].length===0){return best;}
99
+ if(c){try{q=c.call(this,best[1]);}catch(ey){throw new $P.Exception(best[1]);}
100
+ best[1]=q[1];}
101
+ return best;};},forward:function(gr,fname){return function(s){return gr[fname].call(this,s);};},replace:function(rule,repl){return function(s){var r=rule.call(this,s);return[repl,r[1]];};},process:function(rule,fn){return function(s){var r=rule.call(this,s);return[fn.call(this,r[0]),r[1]];};},min:function(min,rule){return function(s){var rx=rule.call(this,s);if(rx[0].length<min){throw new $P.Exception(s);}
102
+ return rx;};}};var _generator=function(op){return function(){var args=null,rx=[];if(arguments.length>1){args=Array.prototype.slice.call(arguments);}else if(arguments[0]instanceof Array){args=arguments[0];}
103
+ if(args){for(var i=0,px=args.shift();i<px.length;i++){args.unshift(px[i]);rx.push(op.apply(null,args));args.shift();return rx;}}else{return op.apply(null,arguments);}};};var gx="optional not ignore cache".split(/\s/);for(var i=0;i<gx.length;i++){_[gx[i]]=_generator(_[gx[i]]);}
104
+ var _vector=function(op){return function(){if(arguments[0]instanceof Array){return op.apply(null,arguments[0]);}else{return op.apply(null,arguments);}};};var vx="each any all".split(/\s/);for(var j=0;j<vx.length;j++){_[vx[j]]=_vector(_[vx[j]]);}}());(function(){var $D=Date,$P=$D.prototype,$C=$D.CultureInfo;var flattenAndCompact=function(ax){var rx=[];for(var i=0;i<ax.length;i++){if(ax[i]instanceof Array){rx=rx.concat(flattenAndCompact(ax[i]));}else{if(ax[i]){rx.push(ax[i]);}}}
105
+ return rx;};$D.Grammar={};$D.Translator={hour:function(s){return function(){this.hour=Number(s);};},minute:function(s){return function(){this.minute=Number(s);};},second:function(s){return function(){this.second=Number(s);};},meridian:function(s){return function(){this.meridian=s.slice(0,1).toLowerCase();};},timezone:function(s){return function(){var n=s.replace(/[^\d\+\-]/g,"");if(n.length){this.timezoneOffset=Number(n);}else{this.timezone=s.toLowerCase();}};},day:function(x){var s=x[0];return function(){this.day=Number(s.match(/\d+/)[0]);};},month:function(s){return function(){this.month=(s.length==3)?"jan feb mar apr may jun jul aug sep oct nov dec".indexOf(s)/4:Number(s)-1;};},year:function(s){return function(){var n=Number(s);this.year=((s.length>2)?n:(n+(((n+2000)<$C.twoDigitYearMax)?2000:1900)));};},rday:function(s){return function(){switch(s){case"yesterday":this.days=-1;break;case"tomorrow":this.days=1;break;case"today":this.days=0;break;case"now":this.days=0;this.now=true;break;}};},finishExact:function(x){x=(x instanceof Array)?x:[x];for(var i=0;i<x.length;i++){if(x[i]){x[i].call(this);}}
106
+ var now=new Date();if((this.hour||this.minute)&&(!this.month&&!this.year&&!this.day)){this.day=now.getDate();}
107
+ if(!this.year){this.year=now.getFullYear();}
108
+ if(!this.month&&this.month!==0){this.month=now.getMonth();}
109
+ if(!this.day){this.day=1;}
110
+ if(!this.hour){this.hour=0;}
111
+ if(!this.minute){this.minute=0;}
112
+ if(!this.second){this.second=0;}
113
+ if(this.meridian&&this.hour){if(this.meridian=="p"&&this.hour<12){this.hour=this.hour+12;}else if(this.meridian=="a"&&this.hour==12){this.hour=0;}}
114
+ if(this.day>$D.getDaysInMonth(this.year,this.month)){throw new RangeError(this.day+" is not a valid value for days.");}
115
+ var r=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second);if(this.timezone){r.set({timezone:this.timezone});}else if(this.timezoneOffset){r.set({timezoneOffset:this.timezoneOffset});}
116
+ return r;},finish:function(x){x=(x instanceof Array)?flattenAndCompact(x):[x];if(x.length===0){return null;}
117
+ for(var i=0;i<x.length;i++){if(typeof x[i]=="function"){x[i].call(this);}}
118
+ var today=$D.today();if(this.now&&!this.unit&&!this.operator){return new Date();}else if(this.now){today=new Date();}
119
+ var expression=!!(this.days&&this.days!==null||this.orient||this.operator);var gap,mod,orient;orient=((this.orient=="past"||this.operator=="subtract")?-1:1);if(!this.now&&"hour minute second".indexOf(this.unit)!=-1){today.setTimeToNow();}
120
+ if(this.month||this.month===0){if("year day hour minute second".indexOf(this.unit)!=-1){this.value=this.month+1;this.month=null;expression=true;}}
121
+ if(!expression&&this.weekday&&!this.day&&!this.days){var temp=Date[this.weekday]();this.day=temp.getDate();if(!this.month){this.month=temp.getMonth();}
122
+ this.year=temp.getFullYear();}
123
+ if(expression&&this.weekday&&this.unit!="month"){this.unit="day";gap=($D.getDayNumberFromName(this.weekday)-today.getDay());mod=7;this.days=gap?((gap+(orient*mod))%mod):(orient*mod);}
124
+ if(this.month&&this.unit=="day"&&this.operator){this.value=(this.month+1);this.month=null;}
125
+ if(this.value!=null&&this.month!=null&&this.year!=null){this.day=this.value*1;}
126
+ if(this.month&&!this.day&&this.value){today.set({day:this.value*1});if(!expression){this.day=this.value*1;}}
127
+ if(!this.month&&this.value&&this.unit=="month"&&!this.now){this.month=this.value;expression=true;}
128
+ if(expression&&(this.month||this.month===0)&&this.unit!="year"){this.unit="month";gap=(this.month-today.getMonth());mod=12;this.months=gap?((gap+(orient*mod))%mod):(orient*mod);this.month=null;}
129
+ if(!this.unit){this.unit="day";}
130
+ if(!this.value&&this.operator&&this.operator!==null&&this[this.unit+"s"]&&this[this.unit+"s"]!==null){this[this.unit+"s"]=this[this.unit+"s"]+((this.operator=="add")?1:-1)+(this.value||0)*orient;}else if(this[this.unit+"s"]==null||this.operator!=null){if(!this.value){this.value=1;}
131
+ this[this.unit+"s"]=this.value*orient;}
132
+ if(this.meridian&&this.hour){if(this.meridian=="p"&&this.hour<12){this.hour=this.hour+12;}else if(this.meridian=="a"&&this.hour==12){this.hour=0;}}
133
+ if(this.weekday&&!this.day&&!this.days){var temp=Date[this.weekday]();this.day=temp.getDate();if(temp.getMonth()!==today.getMonth()){this.month=temp.getMonth();}}
134
+ if((this.month||this.month===0)&&!this.day){this.day=1;}
135
+ if(!this.orient&&!this.operator&&this.unit=="week"&&this.value&&!this.day&&!this.month){return Date.today().setWeek(this.value);}
136
+ if(expression&&this.timezone&&this.day&&this.days){this.day=this.days;}
137
+ return(expression)?today.add(this):today.set(this);}};var _=$D.Parsing.Operators,g=$D.Grammar,t=$D.Translator,_fn;g.datePartDelimiter=_.rtoken(/^([\s\-\.\,\/\x27]+)/);g.timePartDelimiter=_.stoken(":");g.whiteSpace=_.rtoken(/^\s*/);g.generalDelimiter=_.rtoken(/^(([\s\,]|at|@|on)+)/);var _C={};g.ctoken=function(keys){var fn=_C[keys];if(!fn){var c=$C.regexPatterns;var kx=keys.split(/\s+/),px=[];for(var i=0;i<kx.length;i++){px.push(_.replace(_.rtoken(c[kx[i]]),kx[i]));}
138
+ fn=_C[keys]=_.any.apply(null,px);}
139
+ return fn;};g.ctoken2=function(key){return _.rtoken($C.regexPatterns[key]);};g.h=_.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2]|[1-9])/),t.hour));g.hh=_.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2])/),t.hour));g.H=_.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3]|[0-9])/),t.hour));g.HH=_.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3])/),t.hour));g.m=_.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/),t.minute));g.mm=_.cache(_.process(_.rtoken(/^[0-5][0-9]/),t.minute));g.s=_.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/),t.second));g.ss=_.cache(_.process(_.rtoken(/^[0-5][0-9]/),t.second));g.hms=_.cache(_.sequence([g.H,g.m,g.s],g.timePartDelimiter));g.t=_.cache(_.process(g.ctoken2("shortMeridian"),t.meridian));g.tt=_.cache(_.process(g.ctoken2("longMeridian"),t.meridian));g.z=_.cache(_.process(_.rtoken(/^((\+|\-)\s*\d\d\d\d)|((\+|\-)\d\d\:?\d\d)/),t.timezone));g.zz=_.cache(_.process(_.rtoken(/^((\+|\-)\s*\d\d\d\d)|((\+|\-)\d\d\:?\d\d)/),t.timezone));g.zzz=_.cache(_.process(g.ctoken2("timezone"),t.timezone));g.timeSuffix=_.each(_.ignore(g.whiteSpace),_.set([g.tt,g.zzz]));g.time=_.each(_.optional(_.ignore(_.stoken("T"))),g.hms,g.timeSuffix);g.d=_.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1]|\d)/),_.optional(g.ctoken2("ordinalSuffix"))),t.day));g.dd=_.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1])/),_.optional(g.ctoken2("ordinalSuffix"))),t.day));g.ddd=g.dddd=_.cache(_.process(g.ctoken("sun mon tue wed thu fri sat"),function(s){return function(){this.weekday=s;};}));g.M=_.cache(_.process(_.rtoken(/^(1[0-2]|0\d|\d)/),t.month));g.MM=_.cache(_.process(_.rtoken(/^(1[0-2]|0\d)/),t.month));g.MMM=g.MMMM=_.cache(_.process(g.ctoken("jan feb mar apr may jun jul aug sep oct nov dec"),t.month));g.y=_.cache(_.process(_.rtoken(/^(\d\d?)/),t.year));g.yy=_.cache(_.process(_.rtoken(/^(\d\d)/),t.year));g.yyy=_.cache(_.process(_.rtoken(/^(\d\d?\d?\d?)/),t.year));g.yyyy=_.cache(_.process(_.rtoken(/^(\d\d\d\d)/),t.year));_fn=function(){return _.each(_.any.apply(null,arguments),_.not(g.ctoken2("timeContext")));};g.day=_fn(g.d,g.dd);g.month=_fn(g.M,g.MMM);g.year=_fn(g.yyyy,g.yy);g.orientation=_.process(g.ctoken("past future"),function(s){return function(){this.orient=s;};});g.operator=_.process(g.ctoken("add subtract"),function(s){return function(){this.operator=s;};});g.rday=_.process(g.ctoken("yesterday tomorrow today now"),t.rday);g.unit=_.process(g.ctoken("second minute hour day week month year"),function(s){return function(){this.unit=s;};});g.value=_.process(_.rtoken(/^\d\d?(st|nd|rd|th)?/),function(s){return function(){this.value=s.replace(/\D/g,"");};});g.expression=_.set([g.rday,g.operator,g.value,g.unit,g.orientation,g.ddd,g.MMM]);_fn=function(){return _.set(arguments,g.datePartDelimiter);};g.mdy=_fn(g.ddd,g.month,g.day,g.year);g.ymd=_fn(g.ddd,g.year,g.month,g.day);g.dmy=_fn(g.ddd,g.day,g.month,g.year);g.date=function(s){return((g[$C.dateElementOrder]||g.mdy).call(this,s));};g.format=_.process(_.many(_.any(_.process(_.rtoken(/^(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?)/),function(fmt){if(g[fmt]){return g[fmt];}else{throw $D.Parsing.Exception(fmt);}}),_.process(_.rtoken(/^[^dMyhHmstz]+/),function(s){return _.ignore(_.stoken(s));}))),function(rules){return _.process(_.each.apply(null,rules),t.finishExact);});var _F={};var _get=function(f){return _F[f]=(_F[f]||g.format(f)[0]);};g.formats=function(fx){if(fx instanceof Array){var rx=[];for(var i=0;i<fx.length;i++){rx.push(_get(fx[i]));}
140
+ return _.any.apply(null,rx);}else{return _get(fx);}};g._formats=g.formats(["\"yyyy-MM-ddTHH:mm:ssZ\"","yyyy-MM-ddTHH:mm:ssZ","yyyy-MM-ddTHH:mm:ssz","yyyy-MM-ddTHH:mm:ss","yyyy-MM-ddTHH:mmZ","yyyy-MM-ddTHH:mmz","yyyy-MM-ddTHH:mm","ddd, MMM dd, yyyy H:mm:ss tt","ddd MMM d yyyy HH:mm:ss zzz","MMddyyyy","ddMMyyyy","Mddyyyy","ddMyyyy","Mdyyyy","dMyyyy","yyyy","Mdyy","dMyy","d"]);g._start=_.process(_.set([g.date,g.time,g.expression],g.generalDelimiter,g.whiteSpace),t.finish);g.start=function(s){try{var r=g._formats.call({},s);if(r[1].length===0){return r;}}catch(e){}
141
+ return g._start.call({},s);};$D._parse=$D.parse;$D.parse=function(s){var r=null;if(!s){return null;}
142
+ if(s instanceof Date){return s;}
143
+ try{r=$D.Grammar.start.call({},s.replace(/^\s*(\S*(\s+\S+)*)\s*$/,"$1"));}catch(e){return null;}
144
+ return((r[1].length===0)?r[0]:null);};$D.getParseFunction=function(fx){var fn=$D.Grammar.formats(fx);return function(s){var r=null;try{r=fn.call({},s);}catch(e){return null;}
145
+ return((r[1].length===0)?r[0]:null);};};$D.parseExact=function(s,fx){return $D.getParseFunction(fx)(s);};}());
@@ -0,0 +1,112 @@
1
+ // jQuery Autodate
2
+ // by Spencer Steffen
3
+
4
+ // Citrus Media Group
5
+ // spencer@citrusme.com
6
+ // 2010
7
+
8
+ ;(function(jQuery){
9
+
10
+ var version = '1.0.1'
11
+
12
+ jQuery.fn.extend({
13
+ autodate:function(options){
14
+
15
+ var self = this;
16
+ var input = $(this);
17
+ var helper = $('<span class="helper"></span>');
18
+ var form = input.parents('form:first');
19
+ var date = null;
20
+ var options = $.extend($.fn.autodate.defaults, options);
21
+ var set = false;
22
+
23
+ input.parent().append(helper);
24
+
25
+ if (typeof(this.hasInit) === 'undefined') {
26
+ init();
27
+ this.hasInit = true;
28
+ } else {
29
+ updateDisplay();
30
+ }
31
+
32
+
33
+ return this;
34
+
35
+
36
+
37
+ function init() {
38
+ input.keyup(handleKeys);
39
+ input.focus(handleFocus);
40
+ input.blur(handleBlur);
41
+ form.submit(handleBlur);
42
+ updateDisplay();
43
+ }
44
+ function parseDate() {
45
+ var val = (input.val() || "").replace(/the|of|in|on/gi, '')
46
+ console.log(val);
47
+ console.log(Date.parse(val))
48
+ return date = Date.parse(val);
49
+ }
50
+ function updateDisplay() {
51
+ if (parseDate()) showDate();
52
+ else showHelp();
53
+ }
54
+ function showDate() {
55
+ if (!date) return showHelp();
56
+ input.val(date.toString(options.date_format));
57
+ helper.html("");
58
+ set = true;
59
+ return true;
60
+ }
61
+ function showHelp() {
62
+ if (date) return showDate();
63
+ input.val(options.input_empty);
64
+ helper.html("");
65
+ return true;
66
+ }
67
+ function showDateInHelper() {
68
+ helper.text(date.toString(options.date_format));
69
+ }
70
+ function invalidInput() {
71
+ input.addClass("error").text(options.input_invalid);
72
+ helper.text(options.input_invalid);
73
+ }
74
+ function handleKeys(evt) {
75
+ var enter = evt.keyCode === 13;
76
+ if (enter && date && set) enter = false;
77
+
78
+ evt.preventDefault();
79
+ if (enter) updateDisplay();
80
+
81
+ if (!enter && 0 < input.val().length) {
82
+ parseDate();
83
+ if (date !== null) {
84
+ input.removeClass("error");
85
+ showDateInHelper();
86
+ } else {
87
+ invalidInput();
88
+ }
89
+ }
90
+ //if (enter) evt.preventDefault();
91
+ return !enter;
92
+ }
93
+ function handleFocus(evt) {
94
+ input.val("");
95
+ if (date) showDateInHelper();
96
+ }
97
+ function handleBlur(evt) {
98
+ if (date || parseDate()) showDate();
99
+ else invalidInput();
100
+ }
101
+ }
102
+ });
103
+
104
+ $.fn.autodate.defaults = {
105
+ date_format: "dddd, MMMM d, yyyy h:mm:ss tt",
106
+ //date_format: "MMMM d, yyyy",
107
+ empty_string: "Type a date above",
108
+ input_empty: "Enter any date here..",
109
+ input_invalid: "Please enter a valid date."
110
+ }
111
+
112
+ })(jQuery);