From 2715c1ae74d7e3c8c3c614f211576abbdf5b4377 Mon Sep 17 00:00:00 2001 From: Adam Shaw Date: Sun, 31 May 2009 20:56:02 +0000 Subject: [PATCH] add test suit. almost at 1.2 --- Makefile | 35 ++--- changelog.txt | 28 +++- docs/index.txt | 14 +- examples/basic.html | 20 --- fullcalendar/fullcalendar.css | 9 ++ fullcalendar/fullcalendar.js | 72 ++++++---- fullcalendar/gcal.js | 20 +-- test/actions.html | 134 +++++++++++++++++++ test/jgrowl/jgrowl.css | 119 +++++++++++++++++ test/jgrowl/jgrowl.js | 241 ++++++++++++++++++++++++++++++++++ test/locale.html | 89 +++++++++++++ test/methods.html | 108 +++++++++++++++ test/options.html | 95 ++++++++++++++ test/sources.html | 136 +++++++++++++++++++ 14 files changed, 1030 insertions(+), 90 deletions(-) create mode 100644 test/actions.html create mode 100755 test/jgrowl/jgrowl.css create mode 100755 test/jgrowl/jgrowl.js create mode 100644 test/locale.html create mode 100644 test/methods.html create mode 100644 test/options.html create mode 100644 test/sources.html diff --git a/Makefile b/Makefile index 41b7ce8..013e141 100644 --- a/Makefile +++ b/Makefile @@ -5,30 +5,33 @@ FILES =\ examples\ changelog.txt +VER = `cat version.txt` +VVER = `cat ../version.txt` +DATE = `svn info | grep Date: | sed 's/.*: //g'` +REV = `svn info | grep Rev: | sed 's/.*: //g'` + min: @java -jar build/yuicompressor-2.4.2.jar -o build/fullcalendar.min.js fullcalendar/fullcalendar.js - sed -i "s/* FullCalendar/& v`cat version.txt`/" build/fullcalendar.min.js - sed -i "s/* Date:/& `svn info fullcalendar/fullcalendar.js | grep Date: | sed 's/.*: //g'`/" build/fullcalendar.min.js - sed -i "s/* Revision:/& `svn info fullcalendar/fullcalendar.js | grep Rev: | sed 's/.*: //g'`/" build/fullcalendar.min.js zip: - @mkdir -p build/F - @cp -rt build/F ${FILES} .svn - @for f in build/F/fullcalendar/*.js; do\ - sed -i "s/* FullCalendar/& v`cat version.txt`/" $$f;\ - sed -i "s/* Date:/& `svn info $$f | grep Date: | sed 's/.*: //g'`/" $$f;\ - sed -i "s/* Revision:/& `svn info $$f | grep Rev: | sed 's/.*: //g'`/" $$f;\ - done - @rm -rf `find build/F -type d -name .svn` + @mkdir -p build/fullcalendar-${VER} + @cp -rt build/fullcalendar-${VER} ${FILES} @if [ -e build/fullcalendar.min.js ];\ - then cp build/fullcalendar.min.js build/F/fullcalendar;\ - else echo "WARNING: fullcalendar.js not yet minified.";\ + then cp build/fullcalendar.min.js build/fullcalendar-${VER}/fullcalendar;\ + else echo "\n!!! WARNING: fullcalendar.js not yet minified.\n";\ fi - @cd build/F; zip -r fullcalendar-`cat ../../version.txt`.zip * - @mv build/F/fullcalendar-*.zip dist - @rm -rf build/F + @rm -rf `find build -type d -name .svn` + @for f in build/fullcalendar-${VER}/fullcalendar/*.js; do\ + sed -i "s/* FullCalendar/& v${VER}/" $$f;\ + sed -i "s/* Date:/& ${DATE}/" $$f;\ + sed -i "s/* Revision:/& ${REV}/" $$f;\ + done + @cd build; zip -r fullcalendar-${VVER}.zip fullcalendar-${VVER} + @mv build/fullcalendar-${VER}.zip dist + @rm -rf build/fullcalendar-${VER} @rm -f build/fullcalendar.min.js clean: @rm -rf dist/* + @rm -rf build/fullcalendar-* @rm -f build/*.js diff --git a/changelog.txt b/changelog.txt index e0c766f..b8197f2 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,11 +1,25 @@ -version 1.2 - - cssClass attribute for CalEvents - - multiple event sources (using an array for the 'events' option) - - the 'events' option for fullCalendar() and gcalFullCalendar() is now optional - - bugs w/ month date formatting - - change behavior for parsing number strings (now as unix timestamp) - - allow multiple classes in cssClass +version 1.2 (5/31/09) + - expanded API + - 'className' CalEvent attribute + - 'source' CalEvent attribute + - dynamically get/add/remove/update events of current month + - locale improvements: change month/day name text + - better date formatting ($.fullCalendar.formatDate) + - multiple 'event sources' allowed + - dynamically add/remove event sources + - docs have been reworked (include addition of Google Calendar docs) + - changed behavior of parseDate for number strings + (now interpets as unix timestamp, not MS times) + - bugfixes + - rightToLeft month start bug + - off-by-one errors with month formatting commands + - events from previous months sticking when clicking prev/next quickly + - Google Calendar API changed to work w/ multiple event sources + - can also provide 'className' and 'draggable' options + - date utilties moved from $ properties to $.fullCalendar + - minified version of fullcalendar.js + - test suit (available from svn) version 1.1 (5/10/09) - Added the following options: diff --git a/docs/index.txt b/docs/index.txt index ea99077..bd0e0d1 100644 --- a/docs/index.txt +++ b/docs/index.txt @@ -2,7 +2,7 @@ Main Usage ========== -The following code initializes a FullCalendar within an element with ID 'calendar':: +The following code initializes a FullCalendar within an element of ID 'calendar':: $('#calendar').fullCalendar({ @@ -101,8 +101,9 @@ special happens: **eventRender**: function(calEvent, element) Triggered before an element is rendered for the given :ref:`CalEvent `. - ``element`` is the jQuery element that will be used by default. You can modify + ``element`` is the jQuery element that will be used by default. You may modify this element or return a brand new element that will be used instead. + Returning ``false`` will prevent the event from being rendered at all. This function is great for attaching other jQuery plugins to each event element, such as a `qTip `_ @@ -265,11 +266,10 @@ CalEvent: do this automatically. The following methods can be called on a FullCalendar that has already been -initialized. These methods get/add/remove/update the event elements that -currently reside on the calendar. Note that when you are using a JSON feed or custom -event source, your event is never *permanently* deleted, because it may be -refetched from the source at a later time. It is up to the developer to delete -the event(s) from any database. +initialized. These methods get/add/update/remove events on the current month. +For JSON and custom event sources, changes are never *permanent* because they +may be overwritten by a refetch. The developer is responsible for updating +any remote databases. **.fullCalendar(** ``'addEvent'``, **calEvent)** Add an event to the current month on-the-fly. ``calEvent`` is an object diff --git a/examples/basic.html b/examples/basic.html index 0a4382b..bac04af 100644 --- a/examples/basic.html +++ b/examples/basic.html @@ -25,25 +25,6 @@ $(document).ready(function() { - $('input').click(function() { - - /*$('#calendar').fullCalendar("addEvent", { - id: 999, - title: "Adam Shaw", - start: "2009-05-18" - });*/ - - //$('#calendar').fullCalendar("removeEvent", 3); - - var events = $('#calendar').fullCalendar('getEventsById', 2); - var ev1 = events[0]; - ev1.title = "yo"; - ev1.start = '2009-05-14'; - ev1.end = '2009-05-16'; - $('#calendar').fullCalendar('updateEvent', ev1); - - }); - var d = new Date(); var y = d.getFullYear(); var m = d.getMonth(); @@ -87,7 +68,6 @@ -
diff --git a/fullcalendar/fullcalendar.css b/fullcalendar/fullcalendar.css index 68ce1a4..3fb5720 100644 --- a/fullcalendar/fullcalendar.css +++ b/fullcalendar/fullcalendar.css @@ -126,6 +126,15 @@ font-weight: bold; } + /* To change the color of events on a per-class basis (such as with the + * "className" attribute of a CalEvent), do something like this: + * + * .full-calendar-month .myclass td { + * background: green; + * } + */ + + /* the rectangle that covers a day when dragging an event */ diff --git a/fullcalendar/fullcalendar.js b/fullcalendar/fullcalendar.js index e8bb061..8511349 100644 --- a/fullcalendar/fullcalendar.js +++ b/fullcalendar/fullcalendar.js @@ -218,7 +218,13 @@ addEventSource: function(src) { eventSources.push(src); + if (options.loading) { + options.loading(true); + } fetchEventSource(src, function() { + if (options.loading) { + options.loading(false); + } clearEventElements(); renderEvents(); }); @@ -530,7 +536,7 @@ }); } }); - segs.sort(segSort); + segs.sort(segCmp); var levels = []; $.each(segs, function(j, seg) { var l = 0; // level index @@ -784,14 +790,16 @@ events[i]._start = cloneDate(events[i].start); } } - if (options.eventDrop) + if (options.eventDrop) { options.eventDrop.call(this, event, delta, ev, ui); + } clearEventElements(); renderEvents(); } dayOverlay.hide(); - if (options.eventDragStop) + if (options.eventDragStop) { options.eventDragStop.call(this, event, ev, ui); + } } }); } @@ -880,12 +888,16 @@ // function dayDate(td) { - var i, tds = tbody.get(0).getElementsByTagName('td'); - for (i=0; i 0) { + var queued = eventSources.length; + var sourceDone = function() { + if (--queued == 0) { + if (options.loading) { + options.loading(false); + } + if (callback) { + callback(events); + } } + }; + if (options.loading) { + options.loading(true); + } + for (var i=0; i click the arrow next to your calendar's name - * -> click "Share this calendar" - * -> check "Make this calendar public" and then Save - * -> click the arrow again, then click "Calendar settings" - * -> in the "Calendar Address" section, click the XML rectangle - * -> the URL is displayed + * Visit http://arshaw.com/fullcalendar/docs/#google-calendar + * for docs and examples. * * Copyright (c) 2009 Adam Shaw * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html + * + * Date: + * Revision: */ (function($) { diff --git a/test/actions.html b/test/actions.html new file mode 100644 index 0000000..5ce6c2d --- /dev/null +++ b/test/actions.html @@ -0,0 +1,134 @@ + + + + + + + + + + + + + +
+ + diff --git a/test/jgrowl/jgrowl.css b/test/jgrowl/jgrowl.css new file mode 100755 index 0000000..ce3edc6 --- /dev/null +++ b/test/jgrowl/jgrowl.css @@ -0,0 +1,119 @@ + +div.jGrowl { + padding: 10px; + z-index: 9999; +} + +/** Special IE6 Style Positioning **/ +div.ie6 { + position: absolute; +} + +div.ie6.top-right { + right: auto; + bottom: auto; + left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.top-left { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.bottom-right { + left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.bottom-left { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.center { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); + width: 100%; +} + +/** Normal Style Positions **/ +body > div.jGrowl { + position: fixed; +} + +body > div.jGrowl.top-left { + left: 0px; + top: 0px; +} + +body > div.jGrowl.top-right { + right: 0px; + top: 0px; +} + +body > div.jGrowl.bottom-left { + left: 0px; + bottom: 0px; +} + +body > div.jGrowl.bottom-right { + right: 0px; + bottom: 0px; +} + +body > div.jGrowl.center { + top: 0px; + width: 50%; + left: 25%; +} + +/** Cross Browser Styling **/ +div.center div.jGrowl-notification, div.center div.jGrowl-closer { + margin-left: auto; + margin-right: auto; +} + +div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer { + background-color: #000; + color: #fff; + opacity: .85; + filter: alpha(opacity = 85); + zoom: 1; + width: 235px; + padding: 10px; + margin-top: 5px; + margin-bottom: 5px; + font-family: Tahoma, Arial, Helvetica, sans-serif; + font-size: 12px; + text-align: left; + display: none; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; +} + +div.jGrowl div.jGrowl-notification { + min-height: 40px; +} + +div.jGrowl div.jGrowl-notification div.header { + font-weight: bold; + font-size: 10px; +} + +div.jGrowl div.jGrowl-notification div.close { + float: right; + font-weight: bold; + font-size: 12px; + cursor: pointer; +} + +div.jGrowl div.jGrowl-closer { + height: 15px; + padding-top: 4px; + padding-bottom: 4px; + cursor: pointer; + font-size: 11px; + font-weight: bold; + text-align: center; +} diff --git a/test/jgrowl/jgrowl.js b/test/jgrowl/jgrowl.js new file mode 100755 index 0000000..352f81d --- /dev/null +++ b/test/jgrowl/jgrowl.js @@ -0,0 +1,241 @@ +/** + * jGrowl 1.2.0 + * + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * Written by Stan Lemon + * Last updated: 2009.05.11 + * + * jGrowl is a jQuery plugin implementing unobtrusive userland notifications. These + * notifications function similarly to the Growl Framework available for + * Mac OS X (http://growl.info). + * + * To Do: + * - Move library settings to containers and allow them to be changed per container + * + * Changes in 1.2.0 + * - Added message pooling to limit the number of messages appearing at a given time. + * - Closing a notification is now bound to the notification object and triggered by the close button. + * + * Changes in 1.1.2 + * - Added iPhone styled example + * - Fixed possible IE7 bug when determining if the ie6 class shoudl be applied. + * - Added template for the close button, so that it's content could be customized. + * + * Changes in 1.1.1 + * - Fixed CSS styling bug for ie6 caused by a mispelling + * - Changes height restriction on default notifications to min-height + * - Added skinned examples using a variety of images + * - Added the ability to customize the content of the [close all] box + * - Added jTweet, an example of using jGrowl + Twitter + * + * Changes in 1.1.0 + * - Multiple container and instances. + * - Standard $.jGrowl() now wraps $.fn.jGrowl() by first establishing a generic jGrowl container. + * - Instance methods of a jGrowl container can be called by $.fn.jGrowl(methodName) + * - Added glue preferenced, which allows notifications to be inserted before or after nodes in the container + * - Added new log callback which is called before anything is done for the notification + * - Corner's attribute are now applied on an individual notification basis. + * + * Changes in 1.0.4 + * - Various CSS fixes so that jGrowl renders correctly in IE6. + * + * Changes in 1.0.3 + * - Fixed bug with options persisting across notifications + * - Fixed theme application bug + * - Simplified some selectors and manipulations. + * - Added beforeOpen and beforeClose callbacks + * - Reorganized some lines of code to be more readable + * - Removed unnecessary this.defaults context + * - If corners plugin is present, it's now customizable. + * - Customizable open animation. + * - Customizable close animation. + * - Customizable animation easing. + * - Added customizable positioning (top-left, top-right, bottom-left, bottom-right, center) + * + * Changes in 1.0.2 + * - All CSS styling is now external. + * - Added a theme parameter which specifies a secondary class for styling, such + * that notifications can be customized in appearance on a per message basis. + * - Notification life span is now customizable on a per message basis. + * - Added the ability to disable the global closer, enabled by default. + * - Added callbacks for when a notification is opened or closed. + * - Added callback for the global closer. + * - Customizable animation speed. + * - jGrowl now set itself up and tears itself down. + * + * Changes in 1.0.1: + * - Removed dependency on metadata plugin in favor of .data() + * - Namespaced all events + */ +(function($) { + + /** jGrowl Wrapper - Establish a base jGrowl Container for compatibility with older releases. **/ + $.jGrowl = function( m , o ) { + // To maintain compatibility with older version that only supported one instance we'll create the base container. + if ( $('#jGrowl').size() == 0 ) $('
').addClass($.jGrowl.defaults.position).appendTo('body'); + // Create a notification on the container. + $('#jGrowl').jGrowl(m,o); + }; + + + /** Raise jGrowl Notification on a jGrowl Container **/ + $.fn.jGrowl = function( m , o ) { + if ( $.isFunction(this.each) ) { + var args = arguments; + + return this.each(function() { + var self = this; + + /** Create a jGrowl Instance on the Container if it does not exist **/ + if ( $(this).data('jGrowl.instance') == undefined ) { + $(this).data('jGrowl.instance', new $.fn.jGrowl()); + $(this).data('jGrowl.instance').startup( this ); + } + + /** Optionally call jGrowl instance methods, or just raise a normal notification **/ + if ( $.isFunction($(this).data('jGrowl.instance')[m]) ) { + $(this).data('jGrowl.instance')[m].apply( $(this).data('jGrowl.instance') , $.makeArray(args).slice(1) ); + } else { + $(this).data('jGrowl.instance').create( m , o ); + } + }); + }; + }; + + $.extend( $.fn.jGrowl.prototype , { + + /** Default JGrowl Settings **/ + defaults: { + pool: 0, + header: '', + group: '', + sticky: false, + position: 'top-right', // Is this still needed? + glue: 'after', + theme: 'default', + corners: '10px', + check: 250, + life: 3000, + speed: 'normal', + easing: 'swing', + closer: true, + closeTemplate: '×', + closerTemplate: '
[ close all ]
', + log: function(e,m,o) {}, + beforeOpen: function(e,m,o) {}, + open: function(e,m,o) {}, + beforeClose: function(e,m,o) {}, + close: function(e,m,o) {}, + animateOpen: { + opacity: 'show' + }, + animateClose: { + opacity: 'hide' + } + }, + + notifications: [], + + /** jGrowl Container Node **/ + element: null, + + /** Interval Function **/ + interval: null, + + /** Create a Notification **/ + create: function( message , o ) { + var o = $.extend({}, this.defaults, o); + + this.notifications[ this.notifications.length ] = { message: message , options: o }; + + o.log.apply( this.element , [this.element,message,o] ); + }, + + render: function( notification ) { + var self = this; + var message = notification.message; + var o = notification.options; + + var notification = $('
' + o.closeTemplate + '
' + o.header + '
' + message + '
') + .data("jGrowl", o).addClass(o.theme).children('div.close').bind("click.jGrowl", function() { + $(this).parent().trigger('jGrowl.close'); + }).parent(); + + ( o.glue == 'after' ) ? $('div.jGrowl-notification:last', this.element).after(notification) : $('div.jGrowl-notification:first', this.element).before(notification); + + /** Notification Actions **/ + $(notification).bind("mouseover.jGrowl", function() { + $(this).data("jGrowl").pause = true; + }).bind("mouseout.jGrowl", function() { + $(this).data("jGrowl").pause = false; + }).bind('jGrowl.beforeOpen', function() { + o.beforeOpen.apply( self.element , [self.element,message,o] ); + }).bind('jGrowl.open', function() { + o.open.apply( self.element , [self.element,message,o] ); + }).bind('jGrowl.beforeClose', function() { + o.beforeClose.apply( self.element , [self.element,message,o] ); + }).bind('jGrowl.close', function() { + $(this).trigger('jGrowl.beforeClose').animate(o.animateClose, o.speed, o.easing, function() { + $(this).remove(); + o.close.apply( self.element , [self.element,message,o] ); + }); + }).trigger('jGrowl.beforeOpen').animate(o.animateOpen, o.speed, o.easing, function() { + $(this).data("jGrowl").created = new Date(); + }).trigger('jGrowl.open'); + + /** Optional Corners Plugin **/ + if ( $.fn.corner != undefined ) $(notification).corner( o.corners ); + + /** Add a Global Closer if more than one notification exists **/ + if ( $('div.jGrowl-notification:parent', this.element).size() > 1 && $('div.jGrowl-closer', this.element).size() == 0 && this.defaults.closer != false ) { + $(this.defaults.closerTemplate).addClass('jGrowl-closer').addClass(this.defaults.theme).appendTo(this.element).animate(this.defaults.animateOpen, this.defaults.speed, this.defaults.easing).bind("click.jGrowl", function() { + $(this).siblings().children('div.close').trigger("click.jGrowl"); + + if ( $.isFunction( self.defaults.closer ) ) self.defaults.closer.apply( $(this).parent()[0] , [$(this).parent()[0]] ); + }); + }; + }, + + /** Update the jGrowl Container, removing old jGrowl notifications **/ + update: function() { + $(this.element).find('div.jGrowl-notification:parent').each( function() { + if ( $(this).data("jGrowl") != undefined && $(this).data("jGrowl").created != undefined && ($(this).data("jGrowl").created.getTime() + $(this).data("jGrowl").life) < (new Date()).getTime() && $(this).data("jGrowl").sticky != true && + ($(this).data("jGrowl").pause == undefined || $(this).data("jGrowl").pause != true) ) { + $(this).trigger('jGrowl.close'); + } + }); + + if ( this.notifications.length > 0 && (this.defaults.pool == 0 || $(this.element).find('div.jGrowl-notification:parent').size() < this.defaults.pool) ) { + this.render( this.notifications.shift() ); + } + + if ( $(this.element).find('div.jGrowl-notification:parent').size() < 2 ) { + $(this.element).find('div.jGrowl-closer').animate(this.defaults.animateClose, this.defaults.speed, this.defaults.easing, function() { + $(this).remove(); + }); + }; + }, + + /** Setup the jGrowl Notification Container **/ + startup: function(e) { + this.element = $(e).addClass('jGrowl').append('
'); + this.interval = setInterval( function() { + jQuery(e).data('jGrowl.instance').update(); + }, this.defaults.check); + + if ($.browser.msie && parseInt($.browser.version) < 7 && !window["XMLHttpRequest"]) $(this.element).addClass('ie6'); + }, + + /** Shutdown jGrowl, removing it and clearing the interval **/ + shutdown: function() { + $(this.element).removeClass('jGrowl').find('div.jGrowl-notification').remove(); + clearInterval( this.interval ); + } + }); + + /** Reference the Defaults Object for compatibility with older versions of jGrowl **/ + $.jGrowl.defaults = $.fn.jGrowl.prototype.defaults; + +})(jQuery); \ No newline at end of file diff --git a/test/locale.html b/test/locale.html new file mode 100644 index 0000000..6b26882 --- /dev/null +++ b/test/locale.html @@ -0,0 +1,89 @@ + + + + + + + + + + + + + +
+ + diff --git a/test/methods.html b/test/methods.html new file mode 100644 index 0000000..990d851 --- /dev/null +++ b/test/methods.html @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + +
+
+
+
+
+
+ +

+

+today   +prev   +next   +June 1986 +

+
+ + diff --git a/test/options.html b/test/options.html new file mode 100644 index 0000000..06a75af --- /dev/null +++ b/test/options.html @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + +
+ + diff --git a/test/sources.html b/test/sources.html new file mode 100644 index 0000000..c85992b --- /dev/null +++ b/test/sources.html @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
+
+ +
+ + +
+ +