diff --git a/docs/date-utils.txt b/docs/date-utils.txt index b970dd6..95907df 100755 --- a/docs/date-utils.txt +++ b/docs/date-utils.txt @@ -1,69 +1,69 @@ - -Date Utilities -============== - -**formatDate** - $.fullCalendar.formatDate(*date, formatString, [options]*) - Format a date into a string value with a specified format. - The format can be combinations of the following: - - * **s** - seconds - * **ss** - seconds, 2 digits - * **m** - minutes - * **mm** - minutes, 2 digits - * **h** - hours - * **hh** - hours, 2 digits - * **H** - hours, military time - * **HH** - hours, milirary time, 2 digits - * **d** - date number - * **dd** - date number, 2 digits - * **ddd** - date name, short - * **dddd** - date name, full - * **M** - month number - * **MM** - month number, 2 digits - * **MMM** - month name, short - * **MMMM** - month name, full - * **yy** - year, 2 digits - * **yyyy** - year, 4 digits - * **t** - 'a' or 'p' - * **tt** - 'am' or 'pm' - * **T** - 'A' or 'P' - * **TT** - 'AM' or 'PM' - * **u** - ISO8601 format - * **S** - 'st', 'nd', 'rd', 'th' for the date - - Special Characters: - - ``'...'`` - literal text - - ``''`` - single quote - - ``(...)`` - only displays format if one of the enclosed variables is non-zero - - *options* can override any of the :ref:`Locale Options` - - -.. _formatDates: - -**formatDates** - $.fullCalendar.formatDates(*date1, date2, formatString, [options]*) - Similar to ``formatDate``, but accepts *two* dates, leveraging the following - special characters in *formatString*: - - ``{...}`` - switches to formatting the 2nd date - - ``[...]`` - only displays the enclosed format if the current date is different from the - alternate date in the same regards - - -**parseDate** - $.fullCalendar.parseDate(*string*) - Parses a string and returns a javascript Date object. - The string may be in ISO8601 format, IETF format, or a UNIX timestamp. - - -**parseISO8601** - $.fullCalendar.parseISO8601(*string, [ignoreTimezone]*) - Parses an ISO8601 string into a javascript Date object. + +Date Utilities +============== + +**formatDate** - $.fullCalendar.formatDate(*date, formatString, [options]*) + Format a date into a string value with a specified format. + The format can be combinations of the following: + + * **s** - seconds + * **ss** - seconds, 2 digits + * **m** - minutes + * **mm** - minutes, 2 digits + * **h** - hours + * **hh** - hours, 2 digits + * **H** - hours, military time + * **HH** - hours, milirary time, 2 digits + * **d** - date number + * **dd** - date number, 2 digits + * **ddd** - date name, short + * **dddd** - date name, full + * **M** - month number + * **MM** - month number, 2 digits + * **MMM** - month name, short + * **MMMM** - month name, full + * **yy** - year, 2 digits + * **yyyy** - year, 4 digits + * **t** - 'a' or 'p' + * **tt** - 'am' or 'pm' + * **T** - 'A' or 'P' + * **TT** - 'AM' or 'PM' + * **u** - ISO8601 format + * **S** - 'st', 'nd', 'rd', 'th' for the date + + Special Characters: + + ``'...'`` + literal text + + ``''`` + single quote + + ``(...)`` + only displays format if one of the enclosed variables is non-zero + + *options* can override any of the :ref:`Locale Options` + + +.. _formatDates: + +**formatDates** - $.fullCalendar.formatDates(*date1, date2, formatString, [options]*) + Similar to ``formatDate``, but accepts *two* dates, leveraging the following + special characters in *formatString*: + + ``{...}`` + switches to formatting the 2nd date + + ``[...]`` + only displays the enclosed format if the current date is different from the + alternate date in the same regards + + +**parseDate** - $.fullCalendar.parseDate(*string*) + Parses a string and returns a javascript Date object. + The string may be in ISO8601 format, IETF format, or a UNIX timestamp. + + +**parseISO8601** - $.fullCalendar.parseISO8601(*string, [ignoreTimezone]*) + Parses an ISO8601 string into a javascript Date object. \ No newline at end of file diff --git a/docs/google-calendar.txt b/docs/google-calendar.txt index 86c8e79..bd1da23 100755 --- a/docs/google-calendar.txt +++ b/docs/google-calendar.txt @@ -1,49 +1,49 @@ - -Google Calendar -=============== - -To integrate with your Google Calendar, you must first **make your calendar public**: - -#. In the Google Calendar interface, locate the "My Calendar" box on the left. - -#. Click the arrow next to the calendar you need. - -#. A menu will appear. Click "Share this calendar." - -#. Check "Make this calendar public." - -#. Make sure "Share only my free/busy information" is *unchecked*. - -#. Click "Save." - -Then, you must obtain your calendar's **XML feed URL**. - -#. In the Google Calendar interface, locate the "My Calendar" box on the left - -#. Click the arrow next to the calendar you need. - -#. A menu will appear. Click "Calendar settings." - -#. In the "Calendar Address" section of the screen, click the XML badge. - -#. Your feed's URL will appear. - -The ``$.fullCalendar.gcalFeed`` function produces an event source that can be -passed to the ``events`` or ``eventSources`` options:: - - $('#calendar').fullCalendar({ - - events: $.fullCalendar.gcalFeed( - "http://www.google.com/calendar/feeds/...", // feed URL - { className: 'gcal-events' } // optional options - ) - - }); - -Here is a list of available options: - -* **className** - CSS class to attach to each event from this Google Calendar - -* **editable** - whether to allow dragging/resizing (default: ``false``) - + +Google Calendar +=============== + +To integrate with your Google Calendar, you must first **make your calendar public**: + +#. In the Google Calendar interface, locate the "My Calendar" box on the left. + +#. Click the arrow next to the calendar you need. + +#. A menu will appear. Click "Share this calendar." + +#. Check "Make this calendar public." + +#. Make sure "Share only my free/busy information" is *unchecked*. + +#. Click "Save." + +Then, you must obtain your calendar's **XML feed URL**. + +#. In the Google Calendar interface, locate the "My Calendar" box on the left + +#. Click the arrow next to the calendar you need. + +#. A menu will appear. Click "Calendar settings." + +#. In the "Calendar Address" section of the screen, click the XML badge. + +#. Your feed's URL will appear. + +The ``$.fullCalendar.gcalFeed`` function produces an event source that can be +passed to the ``events`` or ``eventSources`` options:: + + $('#calendar').fullCalendar({ + + events: $.fullCalendar.gcalFeed( + "http://www.google.com/calendar/feeds/...", // feed URL + { className: 'gcal-events' } // optional options + ) + + }); + +Here is a list of available options: + +* **className** - CSS class to attach to each event from this Google Calendar + +* **editable** - whether to allow dragging/resizing (default: ``false``) + See *gcal.html* in the *examples* directory for a complete example. \ No newline at end of file diff --git a/docs/locale.txt b/docs/locale.txt index e1bfbf3..6ab0e7c 100755 --- a/docs/locale.txt +++ b/docs/locale.txt @@ -1,36 +1,36 @@ - -.. _locale: - -Locale Options -============== - -**firstDay**: Integer, *Default*: ``0`` - The day-of-week each week begins. Sunday=0, - Monday=1 (for UK users), Tuesday=2, etc. - -**isRTL**: Boolean, *Default*: ``false`` - Displays the calendar right-to-left (for languages such as Arabic and Hebrew) - -**monthNames**: Array, *Default*: ``['January','February','March'...`` - Full names of months. - -**monthNamesShort**: Array, *Default*: ``['Jan','Feb','Mar'...`` - Abbreviated names of months. - -**dayNames**: Array, *Default*: ``['Sunday','Monday','Tuesday'...`` - Full names of days-of-week. - -**dayNamesShort**: Array, *Default*: ``['Sun','Mon','Tue'...`` - Abbreviated names of days-of-week. - -**buttonText**: Object - Text that will be displayed on buttons of the header. Default:: - - { - prev: '◄', // left triangle - next: '►', // right triangle - today: 'today', - month: 'month', - week: 'week', - day: 'day' - } + +.. _locale: + +Locale Options +============== + +**firstDay**: Integer, *Default*: ``0`` + The day-of-week each week begins. Sunday=0, + Monday=1 (for UK users), Tuesday=2, etc. + +**isRTL**: Boolean, *Default*: ``false`` + Displays the calendar right-to-left (for languages such as Arabic and Hebrew) + +**monthNames**: Array, *Default*: ``['January','February','March'...`` + Full names of months. + +**monthNamesShort**: Array, *Default*: ``['Jan','Feb','Mar'...`` + Abbreviated names of months. + +**dayNames**: Array, *Default*: ``['Sunday','Monday','Tuesday'...`` + Full names of days-of-week. + +**dayNamesShort**: Array, *Default*: ``['Sun','Mon','Tue'...`` + Abbreviated names of days-of-week. + +**buttonText**: Object + Text that will be displayed on buttons of the header. Default:: + + { + prev: '◄', // left triangle + next: '►', // right triangle + today: 'today', + month: 'month', + week: 'week', + day: 'day' + } diff --git a/docs/methods.txt b/docs/methods.txt index 7179477..61b7de8 100755 --- a/docs/methods.txt +++ b/docs/methods.txt @@ -1,78 +1,78 @@ - -Methods -======= - -The following are methods that can be called on a FullCalendar-initialized -jQuery object: - -**prev** - .fullCalendar('prev') - Moves the calendar one step back (either by a month, week, or day). - -**next** - .fullCalendar('next') - Moves the calendar one step forward (either by a month, week, or day). - -**today** - .fullCalendar('today') - Moves the calendar to the current date. - -**gotoDate** - .fullCalendar('gotoDate', *year, [month, [date]]*) - Moves the calendar to an arbitrary year/month/date. - - ``month`` is 0-based, meaning January=0, February=1, etc. - -**moveDate** - .fullCalendar('moveDate', *years, [months, [days]]*) - Moves the calendar forward/backward an arbitrary amount of time. - -**updateEvent** - .fullCalendar('updateEvent', *calEvent*) - Reports changes about a modified :ref:`CalEvent `. This will cause the event - to be rerendered on the calendar. - If there are repeating events on the calendar with the - same ID, these events will be changed as well. - - ``calEvent`` must be a :ref:`CalEvent ` retrieved from a - :ref:`Triggered Action` or from the ``clientEvents`` method. - -**renderEvent** - .fullCalendar('renderEvent', *calEvent, [stick]*) - Renders a new event on the calendar. ``calEvent`` must have - at least a ``title`` and a ``start``. - - By default, the event will disappear once the calendar refetches its event - sources (example: when prev/next is clicked). However, specifying ``stick`` as ``true`` - will cause the event to be permanently fixed to the calendar. - -**removeEvents** - .fullCalendar('removeEvents', *[idOrFilter]*) - If the second argument is omitted, all events are removed. - If the second argument is a :ref:`CalEvent's ` ID, all events with - the same ID will be removed. - - The second argument may also be a filter function that accepts - one :ref:`CalEvent ` argument and returns ``true`` or ``false`` about - whether it should be removed. - -**clientEvents** - .fullCalendar('clientEvents', *[idOrFilter]*) - This method will return :ref:`CalEvents ` that FullCalendar has stored on - the client-side (browser). - - If the second argument is omitted, all events will be returned. - If the second argument is a :ref:`CalEvent's ` ID, all events with the - same ID will be returned. - - The second argument may also be a filter function that accepts - one :ref:`CalEvent ` argument and returns ``true`` or ``false`` about - whether it should be included in the result set. - -**addEventSource** - .fullCalendar('addEventSource', *source*) - Adds an :ref:`Event Source `. ``source`` may be an array/string/function just as in - the ``events`` option. Events will be immediately fetched from this source - and placed on the calendar. - -**removeEventSource** - .fullCalendar('removeEventSource', *source*) - Removes an :ref:`Event Source `. ``source`` must be a reference to the - original array/string/function. Events from the source will immediately be - removed from the calendar. - -**rerenderEvents** - .fullCalendar(``'rerenderEvents'``) - Rerenders all events on the screen. - -**refetchEvents** - .fullCalendar(``'refetchEvents'``) - Refetches events from all event sources and rerenders them on the screen. + +Methods +======= + +The following are methods that can be called on a FullCalendar-initialized +jQuery object: + +**prev** - .fullCalendar('prev') + Moves the calendar one step back (either by a month, week, or day). + +**next** - .fullCalendar('next') + Moves the calendar one step forward (either by a month, week, or day). + +**today** - .fullCalendar('today') + Moves the calendar to the current date. + +**gotoDate** - .fullCalendar('gotoDate', *year, [month, [date]]*) + Moves the calendar to an arbitrary year/month/date. + + ``month`` is 0-based, meaning January=0, February=1, etc. + +**moveDate** - .fullCalendar('moveDate', *years, [months, [days]]*) + Moves the calendar forward/backward an arbitrary amount of time. + +**updateEvent** - .fullCalendar('updateEvent', *calEvent*) + Reports changes about a modified :ref:`CalEvent `. This will cause the event + to be rerendered on the calendar. + If there are repeating events on the calendar with the + same ID, these events will be changed as well. + + ``calEvent`` must be a :ref:`CalEvent ` retrieved from a + :ref:`Triggered Action` or from the ``clientEvents`` method. + +**renderEvent** - .fullCalendar('renderEvent', *calEvent, [stick]*) + Renders a new event on the calendar. ``calEvent`` must have + at least a ``title`` and a ``start``. + + By default, the event will disappear once the calendar refetches its event + sources (example: when prev/next is clicked). However, specifying ``stick`` as ``true`` + will cause the event to be permanently fixed to the calendar. + +**removeEvents** - .fullCalendar('removeEvents', *[idOrFilter]*) + If the second argument is omitted, all events are removed. + If the second argument is an ID, all events with + the same ID will be removed. + + The second argument may also be a filter function that accepts + one :ref:`CalEvent ` argument and returns ``true`` if it + should be removed. + +**clientEvents** - .fullCalendar('clientEvents', *[idOrFilter]*) + This method will return an array of :ref:`CalEvents ` that + FullCalendar has stored on the client-side (browser). + + If the second argument is omitted, all events will be returned. + If the second argument is an ID, all events with the + same ID will be returned. + + The second argument may also be a filter function that accepts + one :ref:`CalEvent ` argument and returns ``true`` if it should + be included in the result set. + +**addEventSource** - .fullCalendar('addEventSource', *source*) + Adds an :ref:`Event Source `. ``source`` may be an array/string/function just as in + the ``events`` option. Events will be immediately fetched from this source + and placed on the calendar. + +**removeEventSource** - .fullCalendar('removeEventSource', *source*) + Removes an :ref:`Event Source `. ``source`` must be a reference to the + original array/string/function. Events from the source will immediately be + removed from the calendar. + +**rerenderEvents** - .fullCalendar(``'rerenderEvents'``) + Rerenders all events on the screen. + +**refetchEvents** - .fullCalendar(``'refetchEvents'``) + Refetches events from all event sources and rerenders them on the screen. \ No newline at end of file diff --git a/docs/theming.txt b/docs/theming.txt index a542da1..70e3b49 100755 --- a/docs/theming.txt +++ b/docs/theming.txt @@ -1,25 +1,25 @@ - -Theming -======= - -FullCalendar can be used with jQuery UI themes. Themes provide a more stylized -look for the calendar and can easily be created using the -`jQuery UI ThemeRoller `_. - -In order for themes to work, you must include the theme's CSS file and -*fullcalendar.css* on the current page. You must also enable the ``theme`` option. -Here is the full list of theme-related options: - -**theme**: Boolean, *Default*: ``false`` - Enables/disables use of jQuery UI themes - -**buttonIcons**: Object - Determines which icons appear within header buttons. If a button - does not have an entry, it falls back to using ``buttonText``. - - Here is the default value for ``buttonIcons``:: - - { - prev: 'circle-triangle-w', - next: 'circle-triangle-e' + +Theming +======= + +FullCalendar can be used with jQuery UI themes. Themes provide a more stylized +look for the calendar and can easily be created using the +`jQuery UI ThemeRoller `_. + +In order for themes to work, you must include the theme's CSS file and +*fullcalendar.css* on the current page. You must also enable the ``theme`` option. +Here is the full list of theme-related options: + +**theme**: Boolean, *Default*: ``false`` + Enables/disables use of jQuery UI themes + +**buttonIcons**: Object + Determines which icons appear within header buttons. If a button + does not have an entry, it falls back to using ``buttonText``. + + Here is the default value for ``buttonIcons``:: + + { + prev: 'circle-triangle-w', + next: 'circle-triangle-e' } \ No newline at end of file diff --git a/src/css/agenda.css b/src/css/agenda.css index 95316d3..39fea8e 100755 --- a/src/css/agenda.css +++ b/src/css/agenda.css @@ -1,166 +1,166 @@ - - -/* header styles */ - -.fc .fc-agenda-head th.fc-first { - border-left: 0; - } - -.fc .fc-agenda-head th, -.fc .fc-agenda-head td { - border-width: 1px 0 0 1px; - } - -.fc-agenda-head tr.fc-first th { - border-width: 0 0 0 1px; - } - -.fc-agenda-head tr.fc-last th, -.fc-agenda-head tr.fc-last td { - border-bottom-width: 2px; - } - - - -.fc-agenda-head tr.fc-last th { - /*border-width: 1px 0 1px 1px;*/ - background-image: none; - } - -.fc-agenda-head tr.fc-last th.fc-first { - /*border-width: 0 2px 1px 0;*/ - } - -.fc-agenda-head tr.fc-last th.fc-last { - /*border-width: 0 0 0 3px;*/ - } - -.fc .fc-agenda-head td { - /*border-width: 3px 0 3px 1px;*/ - background: none; - } - - - - -.fc-agenda-body { - /*width: 100%;*/ - overflow: auto; - } - - - - - - -.fc .fc-agenda-body th { - border-width: 1px 0 0 0; - background-image: none; - text-align: right; - font-weight: normal; - vertical-align: middle; - width: 48px; - height: 22px; - padding-right: 2px; - } - -.fc .fc-agenda-body td { - border-width: 1px 0 0 1px; - background: none; - } - -.fc .fc-agenda-body tr.fc-minor th, -.fc .fc-agenda-body tr.fc-minor td { - border-top-style: dotted; - } - -.fc .fc-agenda-body tr.fc-first th, -.fc .fc-agenda-body tr.fc-first td { - border-top: 0; - } - - - -.fc .fc-agenda-bg td { - border-style: double; - border-width: 0 0 0 3px; - } - -.fc .fc-agenda-bg td.fc-not-today { - background: none; - } - - - -.fc-agenda .fc-day-content { - padding: 2px 1px 14px; - } - - - - -/* vertical events */ - -.fc-event-vert { - border-width: 0 1px; - } - -.fc-event-vert a { - border-width: 0; - } - -.fc-content .fc-corner-top { - margin-top: 1px; - } - -.fc-content .fc-corner-top a { - margin-top: -1px; - border-top-width: 1px; - } - -.fc-content .fc-corner-bottom { - margin-bottom: 1px; - } - -.fc-content .fc-corner-bottom a { - margin-bottom: -1px; - border-bottom-width: 1px; - } - -.fc-event-vert span { - display: block; - position: relative; - z-index: 2; - } - -.fc-event-vert span.fc-event-time { - white-space: nowrap; - _white-space: normal; - overflow: hidden; - font-size: 10px; - } - -.fc-event-vert span.fc-event-title { - line-height: 13px; - } - -.fc-event-vert span.fc-event-bg { - position: absolute; - z-index: 1; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: #fff; - opacity: .3; - filter: alpha(opacity=30); - } - -.fc-event-vert .ui-resizable-s { - font-family: monospace; - height: 8px; - font-size: 11px; - line-height: 8px; - bottom: 0; - text-align: center; + + +/* header styles */ + +.fc .fc-agenda-head th.fc-first { + border-left: 0; + } + +.fc .fc-agenda-head th, +.fc .fc-agenda-head td { + border-width: 1px 0 0 1px; + } + +.fc-agenda-head tr.fc-first th { + border-width: 0 0 0 1px; + } + +.fc-agenda-head tr.fc-last th, +.fc-agenda-head tr.fc-last td { + border-bottom-width: 2px; + } + + + +.fc-agenda-head tr.fc-last th { + /*border-width: 1px 0 1px 1px;*/ + background-image: none; + } + +.fc-agenda-head tr.fc-last th.fc-first { + /*border-width: 0 2px 1px 0;*/ + } + +.fc-agenda-head tr.fc-last th.fc-last { + /*border-width: 0 0 0 3px;*/ + } + +.fc .fc-agenda-head td { + /*border-width: 3px 0 3px 1px;*/ + background: none; + } + + + + +.fc-agenda-body { + /*width: 100%;*/ + overflow: auto; + } + + + + + + +.fc .fc-agenda-body th { + border-width: 1px 0 0 0; + background-image: none; + text-align: right; + font-weight: normal; + vertical-align: middle; + width: 48px; + height: 22px; + padding-right: 2px; + } + +.fc .fc-agenda-body td { + border-width: 1px 0 0 1px; + background: none; + } + +.fc .fc-agenda-body tr.fc-minor th, +.fc .fc-agenda-body tr.fc-minor td { + border-top-style: dotted; + } + +.fc .fc-agenda-body tr.fc-first th, +.fc .fc-agenda-body tr.fc-first td { + border-top: 0; + } + + + +.fc .fc-agenda-bg td { + border-style: double; + border-width: 0 0 0 3px; + } + +.fc .fc-agenda-bg td.fc-not-today { + background: none; + } + + + +.fc-agenda .fc-day-content { + padding: 2px 1px 14px; + } + + + + +/* vertical events */ + +.fc-event-vert { + border-width: 0 1px; + } + +.fc-event-vert a { + border-width: 0; + } + +.fc-content .fc-corner-top { + margin-top: 1px; + } + +.fc-content .fc-corner-top a { + margin-top: -1px; + border-top-width: 1px; + } + +.fc-content .fc-corner-bottom { + margin-bottom: 1px; + } + +.fc-content .fc-corner-bottom a { + margin-bottom: -1px; + border-bottom-width: 1px; + } + +.fc-event-vert span { + display: block; + position: relative; + z-index: 2; + } + +.fc-event-vert span.fc-event-time { + white-space: nowrap; + _white-space: normal; + overflow: hidden; + font-size: 10px; + } + +.fc-event-vert span.fc-event-title { + line-height: 13px; + } + +.fc-event-vert span.fc-event-bg { + position: absolute; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: #fff; + opacity: .3; + filter: alpha(opacity=30); + } + +.fc-event-vert .ui-resizable-s { + font-family: monospace; + height: 8px; + font-size: 11px; + line-height: 8px; + bottom: 0; + text-align: center; } \ No newline at end of file diff --git a/src/css/grid.css b/src/css/grid.css index 0e419f4..ed2d5c9 100755 --- a/src/css/grid.css +++ b/src/css/grid.css @@ -1,56 +1,56 @@ - -/* Month View, Basic Week View, Basic Day View -------------------------------------------------------------------------*/ - -.fc-grid table { - width: 100%; - } - -.fc .fc-grid th { - border-width: 0 0 0 1px; - text-align: center; - } - -.fc .fc-grid td { - border-width: 1px 0 0 1px; - } - -.fc-grid th.fc-left, -.fc-grid td.fc-left { - border-left: 0; - } - -.fc-grid .fc-day-number { - float: right; - padding: 0 2px; - } - -.fc-grid .fc-other-month .fc-day-number { - opacity: 0.3; - filter: alpha(opacity=30); - } - -.fc-grid .fc-day-content { - clear: both; - padding: 2px 2px 0; /* distance between events and day edges */ - } - -/* event styles */ - -.fc-grid .fc-event-time { - font-weight: bold; - } - -/* right-to-left */ - -.fc-rtl .fc-grid { - direction: rtl; - } - -.fc-rtl .fc-grid .fc-day-number { - float: left; - } - -.fc-rtl .fc-grid .fc-event-time { - float: right; + +/* Month View, Basic Week View, Basic Day View +------------------------------------------------------------------------*/ + +.fc-grid table { + width: 100%; + } + +.fc .fc-grid th { + border-width: 0 0 0 1px; + text-align: center; + } + +.fc .fc-grid td { + border-width: 1px 0 0 1px; + } + +.fc-grid th.fc-left, +.fc-grid td.fc-left { + border-left: 0; + } + +.fc-grid .fc-day-number { + float: right; + padding: 0 2px; + } + +.fc-grid .fc-other-month .fc-day-number { + opacity: 0.3; + filter: alpha(opacity=30); + } + +.fc-grid .fc-day-content { + clear: both; + padding: 2px 2px 0; /* distance between events and day edges */ + } + +/* event styles */ + +.fc-grid .fc-event-time { + font-weight: bold; + } + +/* right-to-left */ + +.fc-rtl .fc-grid { + direction: rtl; + } + +.fc-rtl .fc-grid .fc-day-number { + float: left; + } + +.fc-rtl .fc-grid .fc-event-time { + float: right; } \ No newline at end of file diff --git a/src/css/main.css b/src/css/main.css index c139a16..08115f1 100755 --- a/src/css/main.css +++ b/src/css/main.css @@ -1,298 +1,300 @@ - -.fc, -.fc .fc-header, -.fc .fc-content { - font-size: 1em; - } - -.fc table { - border-collapse: collapse; - border-spacing: 0; - } - -.fc td, .fc th { - padding: 0; - vertical-align: top; - } - - - -/* Header -------------------------------------------------------------------------*/ - -table.fc-header { - width: 100%; - } - -.fc-header-left { - width: 25%; - } - -.fc-header-left table { - float: left; - } - -.fc-header-center { - width: 50%; - } - -.fc-header-center table { - margin: 0 auto; - } - -.fc-header-right { - width: 25%; - } - -.fc-header-right table { - float: right; - } - -.fc-header-title { - margin-top: 0; - white-space: nowrap; - } - -.fc-header-space { - padding-left: 10px; - } - -/* right-to-left */ - -.fc-rtl .fc-header-title { - direction: rtl; - } - -/* button rounded corners */ - -.fc-header .fc-state-default { - border-width: 1px 0; - padding: 0 1px; - } - -.fc-header .fc-state-default a { - display: block; - position: relative; - margin: 0 -1px; - border-width: 0 1px; - width: 100%; - } - -.fc-header .fc-state-default span { - display: block; - } - -.fc-header .fc-corner-left { - margin-left: 1px; - padding-left: 0; - } - -.fc-header .fc-corner-right { - margin-right: 1px; - padding-right: 0; - } - -.fc-header .fc-no-left { - padding-left: 0; - } - -.fc-header .ui-no-left { - border-left: 0; - } - -/* default button state */ - -.fc-header .fc-state-default, -.fc-header .ui-state-default { - margin-bottom: 10px; - cursor: pointer; - } - -.fc-header .fc-state-default, -.fc-header .fc-state-default a { - border-style: solid; - border-color: #6E6E6E; - color: #333; - } - -.fc-header .fc-state-default span { - border-width: 1px 0 0 1px; - border-style: solid; - border-color: #fff; - background: #F0F0F0; - } - -.fc-header .fc-state-default span, -.fc-header .ui-state-default { - padding: 4px 6px; - } - -/* active button state */ - -.fc-header .fc-state-active a { - color: #fff; - } - -.fc-header .fc-state-active span { - background: #787878; - border-color: #777; - } - -/* down button state */ - -.fc-header .fc-state-down span { - background: #787878; - border-color: #777; - } - -/* disabled button state */ - -.fc-header .fc-state-disabled, -.fc-header .fc-state-disabled a { - border-color: #ccc; - } - -.fc-header .fc-state-disabled a { - color: #999; - } - -.fc-header .fc-state-disabled span { - border-color: #fff; - background: #F0F0F0; - } - - - -/* Content Area & Global Cell Styles -------------------------------------------------------------------------*/ - -.fc-widget-content { - border: 1px solid #ccc; /* outer border color */ - } - -.fc-content { - clear: both; - } - -.fc-content .fc-state-default { - border-style: solid; - border-color: #ccc; /* inner border color */ - } - -.fc-content .fc-state-highlight { /* today */ - background: #FFFFCC; - } - -.fc-content td.fc-not-today { - background: none; - } - -.fc-cell-overlay { /* semi-transparent rectangle while dragging */ - background: #ADDBFF; - opacity: .2; - filter: alpha(opacity=20); /* for IE */ - } - -.fc-view { /* prevents dragging outside of widget */ - width: 100%; - overflow: hidden; - } - - - -/* Global Event Styles -------------------------------------------------------------------------*/ - -.fc-event, -.fc-event a, -.fc-agenda .fc-event-time { - color: #fff; - border-style: solid; - border-color: blue; - background-color: blue; - } - -.fc-event a { - overflow: hidden; - font-size: 11px; - text-decoration: none; - text-align: left; - cursor: pointer; - } - -.fc-event-time, -.fc-event-title { - padding: 0 1px; - } - -.fc-event a { /* prep for rounded corners */ - display: block; - position: relative; - width: 100%; - height: 100%; - } - -/* resizable */ - -.fc .ui-resizable-handle { - display: block; - position: absolute; - z-index: 99999; - } - - - -/* Horizontal Events -------------------------------------------------------------------------*/ - -.fc-event-hori { - border-width: 1px 0; - margin-bottom: 1px; - } - -.fc-event-hori a { - border-width: 0; - } - -.fc-content .fc-corner-left { - margin-left: 1px; - } - -.fc-content .fc-corner-left a { - margin-left: -1px; - border-left-width: 1px; - } - -.fc-content .fc-corner-right { - margin-right: 1px; - } - -.fc-content .fc-corner-right a { - margin-right: -1px; - border-right-width: 1px; - } - -/* resizable */ - -.fc-event-hori .ui-resizable-e { - top: 0; - right: -5px; - width: 7px; - height: 100%; - cursor: e-resize; - } - -.fc-event-hori .ui-resizable-w { - top: 0; - left: -5px; - width: 7px; - height: 100%; - cursor: w-resize; - } - -.fc-event-hori .ui-resizable-handle { - _height: 14px; /* IE6 had 0 height */ - } - - + +.fc, +.fc .fc-header, +.fc .fc-content { + font-size: 1em; + } + +.fc table { + border-collapse: collapse; + border-spacing: 0; + } + +.fc td, .fc th { + padding: 0; + vertical-align: top; + } + + + +/* Header +------------------------------------------------------------------------*/ + +table.fc-header { + width: 100%; + } + +.fc-header-left { + width: 25%; + } + +.fc-header-left table { + float: left; + } + +.fc-header-center { + width: 50%; + } + +.fc-header-center table { + margin: 0 auto; + } + +.fc-header-right { + width: 25%; + } + +.fc-header-right table { + float: right; + } + +.fc-header-title { + margin-top: 0; + white-space: nowrap; + } + +.fc-header-space { + padding-left: 10px; + } + +/* right-to-left */ + +.fc-rtl .fc-header-title { + direction: rtl; + } + +/* button rounded corners */ + +.fc-header .fc-state-default { + border-width: 1px 0; + padding: 0 1px; + } + +.fc-header .fc-state-default a { + display: block; + position: relative; + margin: 0 -1px; + border-width: 0 1px; + width: 100%; + } + +.fc-header .fc-state-default span { + display: block; + } + +.fc-header .fc-corner-left { + margin-left: 1px; + padding-left: 0; + } + +.fc-header .fc-corner-right { + margin-right: 1px; + padding-right: 0; + } + +.fc-header .fc-no-left { + padding-left: 0; + } + +.fc-header .ui-no-left { + border-left: 0; + } + +/* default button state */ + +.fc-header .fc-state-default, +.fc-header .ui-state-default { + margin-bottom: 10px; + cursor: pointer; + } + +.fc-header .fc-state-default, +.fc-header .fc-state-default a { + border-style: solid; + border-color: #6E6E6E; + color: #333; + } + +.fc-header .fc-state-default span { + border-width: 1px 0 0 1px; + border-style: solid; + border-color: #fff; + background: #F0F0F0; + } + +.fc-header .fc-state-default span, +.fc-header .ui-state-default { + padding: 4px 6px; + } + +/* active button state */ + +.fc-header .fc-state-active a { + color: #fff; + } + +.fc-header .fc-state-active span { + background: #787878; + border-color: #777; + } + +/* down button state */ + +.fc-header .fc-state-down span { + background: #787878; + border-color: #777; + } + +/* disabled button state */ + +.fc-header .fc-state-disabled, +.fc-header .fc-state-disabled a { + border-color: #ccc; + } + +.fc-header .fc-state-disabled a { + color: #999; + } + +.fc-header .fc-state-disabled span { + border-color: #fff; + background: #F0F0F0; + } + + + +/* Content Area & Global Cell Styles +------------------------------------------------------------------------*/ + +.fc-widget-content { + border: 1px solid #ccc; /* outer border color */ + } + +.fc-content { + clear: both; + } + +.fc-content .fc-state-default { + border-style: solid; + border-color: #ccc; /* inner border color */ + } + +.fc-content .fc-state-highlight { /* today */ + background: #FFFFCC; + } + +.fc-content td.fc-not-today { + background: none; + } + +.fc-cell-overlay { /* semi-transparent rectangle while dragging */ + background: #ADDBFF; + opacity: .2; + filter: alpha(opacity=20); /* for IE */ + } + +.fc-view { /* prevents dragging outside of widget */ + width: 100%; + overflow: hidden; + } + + + +/* Global Event Styles +------------------------------------------------------------------------*/ + +.fc-event, +.fc-event a, +.fc-agenda .fc-event-time { + color: #fff; + border-style: solid; + border-color: blue; + background-color: blue; + } + +.fc-event a { + overflow: hidden; + font-size: 11px; + text-decoration: none; + text-align: left; + cursor: pointer; + } + +.fc-event-time, +.fc-event-title { + padding: 0 1px; + } + +.fc-event a { /* prep for rounded corners */ + display: block; + position: relative; + width: 100%; + height: 100%; + } + +/* resizable */ + +.fc .ui-resizable-handle { + display: block; + position: absolute; + z-index: 99999; + } + + + +/* Horizontal Events +------------------------------------------------------------------------*/ + +.fc-event-hori { + border-width: 1px 0; + margin-bottom: 1px; + } + +.fc-event-hori a { + border-width: 0; + } + +.fc-content .fc-corner-left { + margin-left: 1px; + } + +.fc-content .fc-corner-left a { + margin-left: -1px; + border-left-width: 1px; + } + +.fc-content .fc-corner-right { + margin-right: 1px; + } + +.fc-content .fc-corner-right a { + margin-right: -1px; + border-right-width: 1px; + } + +/* resizable */ + +.fc-event-hori .ui-resizable-handle { + _height: 14px !important; /* IE6 had 0 height */ + } + +.fc-event-hori .ui-resizable-e { + top: 0 !important; + right: -5px !important; + width: 7px !important; + height: 100% !important; + border: 0 !important; + background: none !important; + cursor: e-resize; + } + +.fc-event-hori .ui-resizable-w { + top: 0 !important; + left: -5px !important; + width: 7px !important; + height: 100% !important; + border: 0 !important; + background: none !important; + cursor: w-resize; + } \ No newline at end of file diff --git a/src/grid.js b/src/grid.js index 809d8b2..c0f3e1f 100755 --- a/src/grid.js +++ b/src/grid.js @@ -62,6 +62,7 @@ views.basicDay = function(element, options) { // flags for [Opera] rendering bugs + var tdTopBug, trTopBug, tbodyTopBug, sniffBugs = true; var tdHeightBug; @@ -100,7 +101,8 @@ function Grid(element, options, methods) { - /********************************* grid rendering *************************************/ + /* Grid Rendering + -----------------------------------------------------------------------------*/ element.addClass('fc-grid').css('position', 'relative'); @@ -289,7 +291,8 @@ function Grid(element, options, methods) { - /******************************** event rendering *****************************/ + /* Event Rendering + -----------------------------------------------------------------------------*/ function renderEvents(events) { @@ -451,7 +454,8 @@ function Grid(element, options, methods) { - /***************************** draggable *********************************/ + /* Draggable + -----------------------------------------------------------------------------*/ function draggableEvent(event, eventElement) { @@ -507,7 +511,8 @@ function Grid(element, options, methods) { - /******************************* resizable *****************************/ + /* Resizable + -----------------------------------------------------------------------------*/ function resizableEvent(event, eventElement) { diff --git a/src/main.js b/src/main.js index 9a29957..f4cfebb 100755 --- a/src/main.js +++ b/src/main.js @@ -413,15 +413,11 @@ $.fn.fullCalendar = function(options) { return e._id == id; }; } - events = filterArray(events, function(e) { - return !filter(e); - }); + events = $.grep(events, filter, true); // remove events from array sources for (var i=0; i - - - - - - - -
- + + + + + + + + +
+ \ No newline at end of file diff --git a/tests/jquery-legacy/ui.resizable.js b/tests/jquery-legacy/ui.resizable.js new file mode 100755 index 0000000..b8bb569 --- /dev/null +++ b/tests/jquery-legacy/ui.resizable.js @@ -0,0 +1,819 @@ +/* + * jQuery UI Resizable 1.6 + * + * Copyright (c) 2008 AUTHORS.txt (http://ui.jquery.com/about) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * http://docs.jquery.com/UI/Resizables + * + * Depends: + * ui.core.js + */ +(function($) { + +$.widget("ui.resizable", $.extend({}, $.ui.mouse, { + + _init: function() { + + var self = this, o = this.options; + + var elpos = this.element.css('position'); + + this.originalElement = this.element; + + // simulate .ui-resizable { position: relative; } + this.element.addClass("ui-resizable").css({ position: /static/.test(elpos) ? 'relative' : elpos }); + + $.extend(o, { + _aspectRatio: !!(o.aspectRatio), + helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null, + knobHandles: o.knobHandles === true ? 'ui-resizable-knob-handle' : o.knobHandles + }); + + //Default Theme + var aBorder = '1px solid #DEDEDE'; + + o.defaultTheme = { + 'ui-resizable': { display: 'block' }, + 'ui-resizable-handle': { position: 'absolute', background: '#F2F2F2', fontSize: '0.1px' }, + 'ui-resizable-n': { cursor: 'n-resize', height: '4px', left: '0px', right: '0px', borderTop: aBorder }, + 'ui-resizable-s': { cursor: 's-resize', height: '4px', left: '0px', right: '0px', borderBottom: aBorder }, + 'ui-resizable-e': { cursor: 'e-resize', width: '4px', top: '0px', bottom: '0px', borderRight: aBorder }, + 'ui-resizable-w': { cursor: 'w-resize', width: '4px', top: '0px', bottom: '0px', borderLeft: aBorder }, + 'ui-resizable-se': { cursor: 'se-resize', width: '4px', height: '4px', borderRight: aBorder, borderBottom: aBorder }, + 'ui-resizable-sw': { cursor: 'sw-resize', width: '4px', height: '4px', borderBottom: aBorder, borderLeft: aBorder }, + 'ui-resizable-ne': { cursor: 'ne-resize', width: '4px', height: '4px', borderRight: aBorder, borderTop: aBorder }, + 'ui-resizable-nw': { cursor: 'nw-resize', width: '4px', height: '4px', borderLeft: aBorder, borderTop: aBorder } + }; + + o.knobTheme = { + 'ui-resizable-handle': { background: '#F2F2F2', border: '1px solid #808080', height: '8px', width: '8px' }, + 'ui-resizable-n': { cursor: 'n-resize', top: '0px', left: '45%' }, + 'ui-resizable-s': { cursor: 's-resize', bottom: '0px', left: '45%' }, + 'ui-resizable-e': { cursor: 'e-resize', right: '0px', top: '45%' }, + 'ui-resizable-w': { cursor: 'w-resize', left: '0px', top: '45%' }, + 'ui-resizable-se': { cursor: 'se-resize', right: '0px', bottom: '0px' }, + 'ui-resizable-sw': { cursor: 'sw-resize', left: '0px', bottom: '0px' }, + 'ui-resizable-nw': { cursor: 'nw-resize', left: '0px', top: '0px' }, + 'ui-resizable-ne': { cursor: 'ne-resize', right: '0px', top: '0px' } + }; + + o._nodeName = this.element[0].nodeName; + + //Wrap the element if it cannot hold child nodes + if(o._nodeName.match(/canvas|textarea|input|select|button|img/i)) { + var el = this.element; + + //Opera fixing relative position + if (/relative/.test(el.css('position')) && $.browser.opera) + el.css({ position: 'relative', top: 'auto', left: 'auto' }); + + //Create a wrapper element and set the wrapper to the new current internal element + el.wrap( + $('
').css( { + position: el.css('position'), + width: el.outerWidth(), + height: el.outerHeight(), + top: el.css('top'), + left: el.css('left') + }) + ); + + var oel = this.element; this.element = this.element.parent(); + + // store instance on wrapper + this.element.data('resizable', this); + + //Move margins to the wrapper + this.element.css({ marginLeft: oel.css("marginLeft"), marginTop: oel.css("marginTop"), + marginRight: oel.css("marginRight"), marginBottom: oel.css("marginBottom") + }); + + oel.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0}); + + //Prevent Safari textarea resize + if ($.browser.safari && o.preventDefault) oel.css('resize', 'none'); + + o.proportionallyResize = oel.css({ position: 'static', zoom: 1, display: 'block' }); + + // avoid IE jump + this.element.css({ margin: oel.css('margin') }); + + // fix handlers offset + this._proportionallyResize(); + } + + if(!o.handles) o.handles = !$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' }; + if(o.handles.constructor == String) { + + o.zIndex = o.zIndex || 1000; + + if(o.handles == 'all') o.handles = 'n,e,s,w,se,sw,ne,nw'; + + var n = o.handles.split(","); o.handles = {}; + + // insertions are applied when don't have theme loaded + var insertionsDefault = { + handle: 'position: absolute; display: none; overflow:hidden;', + n: 'top: 0pt; width:100%;', + e: 'right: 0pt; height:100%;', + s: 'bottom: 0pt; width:100%;', + w: 'left: 0pt; height:100%;', + se: 'bottom: 0pt; right: 0px;', + sw: 'bottom: 0pt; left: 0px;', + ne: 'top: 0pt; right: 0px;', + nw: 'top: 0pt; left: 0px;' + }; + + for(var i = 0; i < n.length; i++) { + var handle = $.trim(n[i]), dt = o.defaultTheme, hname = 'ui-resizable-'+handle, loadDefault = !$.ui.css(hname) && !o.knobHandles, userKnobClass = $.ui.css('ui-resizable-knob-handle'), + allDefTheme = $.extend(dt[hname], dt['ui-resizable-handle']), allKnobTheme = $.extend(o.knobTheme[hname], !userKnobClass ? o.knobTheme['ui-resizable-handle'] : {}); + + // increase zIndex of sw, se, ne, nw axis + var applyZIndex = /sw|se|ne|nw/.test(handle) ? { zIndex: ++o.zIndex } : {}; + + var defCss = (loadDefault ? insertionsDefault[handle] : ''), + axis = $(['
'].join('')).css( applyZIndex ); + o.handles[handle] = '.ui-resizable-'+handle; + + this.element.append( + //Theme detection, if not loaded, load o.defaultTheme + axis.css( loadDefault ? allDefTheme : {} ) + // Load the knobHandle css, fix width, height, top, left... + .css( o.knobHandles ? allKnobTheme : {} ).addClass(o.knobHandles ? 'ui-resizable-knob-handle' : '').addClass(o.knobHandles) + ); + } + + if (o.knobHandles) this.element.addClass('ui-resizable-knob').css( !$.ui.css('ui-resizable-knob') ? { /*border: '1px #fff dashed'*/ } : {} ); + } + + this._renderAxis = function(target) { + target = target || this.element; + + for(var i in o.handles) { + if(o.handles[i].constructor == String) + o.handles[i] = $(o.handles[i], this.element).show(); + + if (o.transparent) + o.handles[i].css({opacity:0}); + + //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls) + if (this.element.is('.ui-wrapper') && + o._nodeName.match(/textarea|input|select|button/i)) { + + var axis = $(o.handles[i], this.element), padWrapper = 0; + + //Checking the correct pad and border + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); + + //The padding type i have to apply... + var padPos = [ 'padding', + /ne|nw|n/.test(i) ? 'Top' : + /se|sw|s/.test(i) ? 'Bottom' : + /^e$/.test(i) ? 'Right' : 'Left' ].join(""); + + if (!o.transparent) + target.css(padPos, padWrapper); + + this._proportionallyResize(); + } + if(!$(o.handles[i]).length) continue; + } + }; + + this._renderAxis(this.element); + o._handles = $('.ui-resizable-handle', self.element); + + if (o.disableSelection) + o._handles.disableSelection(); + + //Matching axis name + o._handles.mouseover(function() { + if (!o.resizing) { + if (this.className) + var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); + //Axis, default = se + self.axis = o.axis = axis && axis[1] ? axis[1] : 'se'; + } + }); + + //If we want to auto hide the elements + if (o.autoHide) { + o._handles.hide(); + $(self.element).addClass("ui-resizable-autohide").hover(function() { + $(this).removeClass("ui-resizable-autohide"); + o._handles.show(); + }, + function(){ + if (!o.resizing) { + $(this).addClass("ui-resizable-autohide"); + o._handles.hide(); + } + }); + } + + this._mouseInit(); + }, + + destroy: function() { + var el = this.element, wrapped = el.children(".ui-resizable").get(0); + + this._mouseDestroy(); + + var _destroy = function(exp) { + $(exp).removeClass("ui-resizable ui-resizable-disabled") + .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove(); + }; + + _destroy(el); + + if (el.is('.ui-wrapper') && wrapped) { + el.parent().append( + $(wrapped).css({ + position: el.css('position'), + width: el.outerWidth(), + height: el.outerHeight(), + top: el.css('top'), + left: el.css('left') + }) + ).end().remove(); + + _destroy(wrapped); + } + }, + + _mouseCapture: function(event) { + + if(this.options.disabled) return false; + + var handle = false; + for(var i in this.options.handles) { + if($(this.options.handles[i])[0] == event.target) handle = true; + } + if (!handle) return false; + + return true; + + }, + + _mouseStart: function(event) { + + var o = this.options, iniPos = this.element.position(), el = this.element, + ie6 = $.browser.msie && $.browser.version < 7; + o.resizing = true; + o.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() }; + + // bugfix #1749 + if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) { + + // sOffset decides if document scrollOffset will be added to the top/left of the resizable element + var sOffset = $.browser.msie && !o.containment && (/absolute/).test(el.css('position')) && !(/relative/).test(el.parent().css('position')); + var dscrollt = sOffset ? this.documentScroll.top : 0, dscrolll = sOffset ? this.documentScroll.left : 0; + + el.css({ position: 'absolute', top: (iniPos.top + dscrollt), left: (iniPos.left + dscrolll) }); + } + + //Opera fixing relative position + if ($.browser.opera && (/relative/).test(el.css('position'))) + el.css({ position: 'relative', top: 'auto', left: 'auto' }); + + this._renderProxy(); + + var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top')); + + if (o.containment) { + curleft += $(o.containment).scrollLeft()||0; + curtop += $(o.containment).scrollTop()||0; + } + + //Store needed variables + this.offset = this.helper.offset(); + this.position = { left: curleft, top: curtop }; + this.size = o.helper || ie6 ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalSize = o.helper || ie6 ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalPosition = { left: curleft, top: curtop }; + this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() }; + this.originalMousePosition = { left: event.pageX, top: event.pageY }; + + //Aspect Ratio + o.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height)||1); + + if (o.preserveCursor) { + var cursor = $('.ui-resizable-' + this.axis).css('cursor'); + $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor); + } + + this._propagate("start", event); + return true; + }, + + _mouseDrag: function(event) { + + //Increase performance, avoid regex + var el = this.helper, o = this.options, props = {}, + self = this, smp = this.originalMousePosition, a = this.axis; + + var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0; + var trigger = this._change[a]; + if (!trigger) return false; + + // Calculate the attrs that will be change + var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff; + + if (o._aspectRatio || event.shiftKey) + data = this._updateRatio(data, event); + + data = this._respectSize(data, event); + + // plugins callbacks need to be called first + this._propagate("resize", event); + + el.css({ + top: this.position.top + "px", left: this.position.left + "px", + width: this.size.width + "px", height: this.size.height + "px" + }); + + if (!o.helper && o.proportionallyResize) + this._proportionallyResize(); + + this._updateCache(data); + + // calling the user callback at the end + this.element.triggerHandler("resize", [event, this.ui()], this.options["resize"]); + + return false; + }, + + _mouseStop: function(event) { + + this.options.resizing = false; + var o = this.options, self = this; + + if(o.helper) { + var pr = o.proportionallyResize, ista = pr && (/textarea/i).test(pr.get(0).nodeName), + soffseth = ista && $.ui.hasScroll(pr.get(0), 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + if (!o.animate) + this.element.css($.extend(s, { top: top, left: left })); + + if (o.helper && !o.animate) this._proportionallyResize(); + } + + if (o.preserveCursor) + $('body').css('cursor', 'auto'); + + this._propagate("stop", event); + + if (o.helper) this.helper.remove(); + + return false; + }, + + _updateCache: function(data) { + var o = this.options; + this.offset = this.helper.offset(); + if (data.left) this.position.left = data.left; + if (data.top) this.position.top = data.top; + if (data.height) this.size.height = data.height; + if (data.width) this.size.width = data.width; + }, + + _updateRatio: function(data, event) { + + var o = this.options, cpos = this.position, csize = this.size, a = this.axis; + + if (data.height) data.width = (csize.height * o.aspectRatio); + else if (data.width) data.height = (csize.width / o.aspectRatio); + + if (a == 'sw') { + data.left = cpos.left + (csize.width - data.width); + data.top = null; + } + if (a == 'nw') { + data.top = cpos.top + (csize.height - data.height); + data.left = cpos.left + (csize.width - data.width); + } + + return data; + }, + + _respectSize: function(data, event) { + + var el = this.helper, o = this.options, pRatio = o._aspectRatio || event.shiftKey, a = this.axis, + ismaxw = data.width && o.maxWidth && o.maxWidth < data.width, ismaxh = data.height && o.maxHeight && o.maxHeight < data.height, + isminw = data.width && o.minWidth && o.minWidth > data.width, isminh = data.height && o.minHeight && o.minHeight > data.height; + + if (isminw) data.width = o.minWidth; + if (isminh) data.height = o.minHeight; + if (ismaxw) data.width = o.maxWidth; + if (ismaxh) data.height = o.maxHeight; + + var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height; + var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); + + if (isminw && cw) data.left = dw - o.minWidth; + if (ismaxw && cw) data.left = dw - o.maxWidth; + if (isminh && ch) data.top = dh - o.minHeight; + if (ismaxh && ch) data.top = dh - o.maxHeight; + + // fixing jump error on top/left - bug #2330 + var isNotwh = !data.width && !data.height; + if (isNotwh && !data.left && data.top) data.top = null; + else if (isNotwh && !data.top && data.left) data.left = null; + + return data; + }, + + _proportionallyResize: function() { + var o = this.options; + if (!o.proportionallyResize) return; + var prel = o.proportionallyResize, el = this.helper || this.element; + + if (!o.borderDif) { + var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')], + p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')]; + + o.borderDif = $.map(b, function(v, i) { + var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0; + return border + padding; + }); + } + prel.css({ + height: (el.height() - o.borderDif[0] - o.borderDif[2]) + "px", + width: (el.width() - o.borderDif[1] - o.borderDif[3]) + "px" + }); + }, + + _renderProxy: function() { + var el = this.element, o = this.options; + this.elementOffset = el.offset(); + + if(o.helper) { + this.helper = this.helper || $('
'); + + // fix ie6 offset + var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0), + pxyoffset = ( ie6 ? 2 : -1 ); + + this.helper.addClass(o.helper).css({ + width: el.outerWidth() + pxyoffset, + height: el.outerHeight() + pxyoffset, + position: 'absolute', + left: this.elementOffset.left - ie6offset +'px', + top: this.elementOffset.top - ie6offset +'px', + zIndex: ++o.zIndex + }); + + this.helper.appendTo("body"); + + if (o.disableSelection) + this.helper.disableSelection(); + + } else { + this.helper = el; + } + }, + + _change: { + e: function(event, dx, dy) { + return { width: this.originalSize.width + dx }; + }, + w: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { left: sp.left + dx, width: cs.width - dx }; + }, + n: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { top: sp.top + dy, height: cs.height - dy }; + }, + s: function(event, dx, dy) { + return { height: this.originalSize.height + dy }; + }, + se: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + sw: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + }, + ne: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + nw: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + } + }, + + _propagate: function(n, event) { + $.ui.plugin.call(this, n, [event, this.ui()]); + if (n != "resize") this.element.triggerHandler(["resize", n].join(""), [event, this.ui()], this.options[n]); + }, + + plugins: {}, + + ui: function() { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + options: this.options, + originalSize: this.originalSize, + originalPosition: this.originalPosition + }; + } + +})); + +$.extend($.ui.resizable, { + version: "1.6", + defaults: { + alsoResize: false, + animate: false, + animateDuration: "slow", + animateEasing: "swing", + aspectRatio: false, + autoHide: false, + cancel: ":input", + containment: false, + disableSelection: true, + distance: 1, + delay: 0, + ghost: false, + grid: false, + knobHandles: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + preserveCursor: true, + preventDefault: true, + proportionallyResize: false, + transparent: false + } +}); + +/* + * Resizable Extensions + */ + +$.ui.plugin.add("resizable", "alsoResize", { + + start: function(event, ui) { + var o = ui.options, self = $(this).data("resizable"), + + _store = function(exp) { + $(exp).each(function() { + $(this).data("resizable-alsoresize", { + width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10), + left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10) + }); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) { + if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); } + else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); } + }else{ + _store(o.alsoResize); + } + }, + + resize: function(event, ui){ + var o = ui.options, self = $(this).data("resizable"), os = self.originalSize, op = self.originalPosition; + + var delta = { + height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0, + top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0 + }, + + _alsoResize = function(exp, c) { + $(exp).each(function() { + var start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left']; + + $.each(css || ['width', 'height', 'top', 'left'], function(i, prop) { + var sum = (start[prop]||0) + (delta[prop]||0); + if (sum && sum >= 0) + style[prop] = sum || null; + }); + $(this).css(style); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) { + $.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); }); + }else{ + _alsoResize(o.alsoResize); + } + }, + + stop: function(event, ui){ + $(this).removeData("resizable-alsoresize-start"); + } +}); + +$.ui.plugin.add("resizable", "animate", { + + stop: function(event, ui) { + var o = ui.options, self = $(this).data("resizable"); + + var pr = o.proportionallyResize, ista = pr && (/textarea/i).test(pr.get(0).nodeName), + soffseth = ista && $.ui.hasScroll(pr.get(0), 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + self.element.animate( + $.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration, + easing: o.animateEasing, + step: function() { + + var data = { + width: parseInt(self.element.css('width'), 10), + height: parseInt(self.element.css('height'), 10), + top: parseInt(self.element.css('top'), 10), + left: parseInt(self.element.css('left'), 10) + }; + + if (pr) pr.css({ width: data.width, height: data.height }); + + // propagating resize, and updating values for each animation step + self._updateCache(data); + self._propagate("animate", event); + + } + } + ); + } + +}); + +$.ui.plugin.add("resizable", "containment", { + + start: function(event, ui) { + var o = ui.options, self = $(this).data("resizable"), el = self.element; + var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc; + if (!ce) return; + + self.containerElement = $(ce); + + if (/document/.test(oc) || oc == document) { + self.containerOffset = { left: 0, top: 0 }; + self.containerPosition = { left: 0, top: 0 }; + + self.parentData = { + element: $(document), left: 0, top: 0, + width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight + }; + } + + // i'm a node, so compute top, left, right, bottom + else{ + var element = $(ce), p = []; + $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); }); + + self.containerOffset = element.offset(); + self.containerPosition = element.position(); + self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) }; + + var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width, + width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch); + + self.parentData = { + element: ce, left: co.left, top: co.top, width: width, height: height + }; + } + }, + + resize: function(event, ui) { + var o = ui.options, self = $(this).data("resizable"), + ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position, + pRatio = o._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement; + + if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co; + + if (cp.left < (o.helper ? co.left : 0)) { + self.size.width = self.size.width + (o.helper ? (self.position.left - co.left) : (self.position.left - cop.left)); + if (pRatio) self.size.height = self.size.width / o.aspectRatio; + self.position.left = o.helper ? co.left : 0; + } + + if (cp.top < (o.helper ? co.top : 0)) { + self.size.height = self.size.height + (o.helper ? (self.position.top - co.top) : self.position.top); + if (pRatio) self.size.width = self.size.height * o.aspectRatio; + self.position.top = o.helper ? co.top : 0; + } + + self.offset.left = self.parentData.left+self.position.left; + self.offset.top = self.parentData.top+self.position.top; + + var woset = Math.abs( (o.helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ), + hoset = Math.abs( (o.helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height ); + + var isParent = self.containerElement.get(0) == self.element.parent().get(0), + isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position')); + + if(isParent && isOffsetRelative) woset -= self.parentData.left; + + if (woset + self.size.width >= self.parentData.width) { + self.size.width = self.parentData.width - woset; + if (pRatio) self.size.height = self.size.width / o.aspectRatio; + } + + if (hoset + self.size.height >= self.parentData.height) { + self.size.height = self.parentData.height - hoset; + if (pRatio) self.size.width = self.size.height * o.aspectRatio; + } + }, + + stop: function(event, ui){ + var o = ui.options, self = $(this).data("resizable"), cp = self.position, + co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement; + + var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height; + + if (o.helper && !o.animate && (/relative/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + if (o.helper && !o.animate && (/static/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + } +}); + +$.ui.plugin.add("resizable", "ghost", { + + start: function(event, ui) { + var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize, cs = self.size; + + if (!pr) self.ghost = self.element.clone(); + else self.ghost = pr.clone(); + + self.ghost.css( + { opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 } + ) + .addClass('ui-resizable-ghost').addClass(typeof o.ghost == 'string' ? o.ghost : ''); + + self.ghost.appendTo(self.helper); + + }, + + resize: function(event, ui){ + var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize; + + if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width }); + + }, + + stop: function(event, ui){ + var o = ui.options, self = $(this).data("resizable"), pr = o.proportionallyResize; + if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0)); + } + +}); + +$.ui.plugin.add("resizable", "grid", { + + resize: function(event, ui) { + var o = ui.options, self = $(this).data("resizable"), cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey; + o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid; + var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1); + + if (/^(se|s|e)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + } + else if (/^(ne)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + } + else if (/^(sw)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.left = op.left - ox; + } + else { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + self.position.left = op.left - ox; + } + } + +}); + +var num = function(v) { + return parseInt(v, 10) || 0; +}; + +})(jQuery); diff --git a/tests/loader.js b/tests/loader.js index f7e0353..89e04c3 100755 --- a/tests/loader.js +++ b/tests/loader.js @@ -1,107 +1,107 @@ - -var _origVars = []; -for (var _prop in window) { - _origVars.push(_prop); -} - -function varLeaks() { - for (var prop in window) { - var found = false; - for (var i=0; i<_origVars.length; i++) { - if (prop == _origVars[i]) { - found = true; - break; - } - } - if (!found) { - console.log(prop); - } - } -} - -var m = window.location.href.match(/\?(.*)$/); -var queryString = m ? m[1] : ''; - -function queryStringParam(name) { - m = queryString.match(new RegExp("(?:^|&)"+name+"(?:=([^&]))?")); - if (m) { - if (m[1]) return m[1]; - return true; - } -} - -function includeJS(src) { - document.write(" - - - -
- + + + + + + + +
+ \ No newline at end of file diff --git a/tests/methods.html b/tests/methods.html index 9034ad5..2625455 100644 --- a/tests/methods.html +++ b/tests/methods.html @@ -1,150 +1,150 @@ - - - - - - - - -

- - - - - - - - - - - - -
- - - - - - - -
- - - - - - - - - - - -

-
- + + + + + + + + +

+ + + + + + + + + + + + +
+ + + + + + + +
+ + + + + + + + + + + +

+
+ \ No newline at end of file diff --git a/tests/options.html b/tests/options.html index 9f3c732..ff5b888 100644 --- a/tests/options.html +++ b/tests/options.html @@ -1,109 +1,110 @@ - - - - - - - -
- + + + + + + + +
+ \ No newline at end of file diff --git a/tests/sources.html b/tests/sources.html index 3b1eca7..e126915 100644 --- a/tests/sources.html +++ b/tests/sources.html @@ -1,144 +1,144 @@ - - - - - - - - - -

- -

-
- + + + + + + + + + +

+ +

+
+ \ No newline at end of file diff --git a/tests/theming.html b/tests/theming.html index 86593d4..acb26df 100755 --- a/tests/theming.html +++ b/tests/theming.html @@ -1,87 +1,87 @@ - - - - - - - - -
- + + + + + + + + +
+ \ No newline at end of file diff --git a/tests/triggers.html b/tests/triggers.html index 7ff112e..ed2e286 100755 --- a/tests/triggers.html +++ b/tests/triggers.html @@ -1,180 +1,180 @@ - - - - - - - -
- + + + + + + + +
+ \ No newline at end of file